词法分析器的功能是输入源程序,输出单词符号。单词符号是一个程序语言的基本语法符号。程序语言的符号一般可以定义为以下几种:

  1. 关键字 是由程序语言定义的具有固定意义的标识符,也称这些标识符为保留字或基本字。例如:c++语言中的define、do、for、while、if、else等
  2. 标识符用来表示各种名字,如变量名、数组名、函数名等
  3. 常数 常数一般有整形、实型、布尔型、文字型等。
  4. 运算符 如:+、-、>、<、*、/等
  5. 界符 如:逗号、分号、括号等

    词法分析器所输出的单词符号常常表示成二元式(单词种别,单词符号属性值)的形式。
    下面是一个由c++写成的词法分析器,使用环境为vs2015:

#include "stdafx.h"
#include <iostream>
#include<string>
using namespace std;
#define MAX 22
char ch = ' ';
string key[19] = { "int","long","double","string","bool","char","final","if","else","switch","case",
"then","return","for","while","do","const","include","define" };//判断是否为保留字
bool IsKey(string c)
{int i;for (i = 0; i < MAX; i++) {if (key[i].compare(c) == 0) return true;}return false;
}
//判断是否为字母
bool IsLetter(char c)
{if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) return true;else return false;
}
//判断是否为数字
bool IsDigit(char c)
{if (c >= '0'&&c <= '9') return true;else return false;
}
//扫描文本
void scan(FILE *fpin) {string arr = "";while ((ch = fgetc(fpin)) != EOF) {arr = "";if (ch == ' ' || ch == '\t' || ch == '\n') {}else if (IsLetter(ch)) {while (IsLetter(ch) || IsDigit(ch)) {if ((ch <= 'Z') && (ch >= 'A')) ch = ch + 32;arr = arr + ch;ch = fgetc(fpin);}fseek(fpin, -1L, SEEK_CUR);if (IsKey(arr)) { cout << arr << "\t$关键字" << endl; }else  cout << arr << "\t$普通标识符" << endl;}else if (IsDigit(ch)) {while (IsDigit(ch) || ch == '.'&&IsDigit(fgetc(fpin))) {arr = arr + ch;ch = fgetc(fpin);}fseek(fpin, -1L, SEEK_CUR);cout << arr << "\t$无符号实数" << endl;}else switch (ch) {case'+':case'-':case'*':case'=':case'/':cout << ch << "\t$运算符" << endl; break;case'(':case')':case'[':case']':case';':case'.':case',':case'{':case'#':case'"':case'\'':case'}':cout << ch << "\t$界符" << endl; break;case':': {ch = fgetc(fpin);if (ch == '=') cout << ":=" << "\t$运算符" << endl;else {cout << "=" << "\t$运算符" << endl;;fseek(fpin, -1L, SEEK_CUR);}}break;case'>': {ch = fgetc(fpin);if (ch == '=') cout << ">=" << "\t$运算符" << endl;if (ch == '>')cout << ">>" << "\t$输入控制符" << endl;else {cout << ">" << "\t$运算符" << endl;fseek(fpin, -1L, SEEK_CUR);}}break;case'<': {ch = fgetc(fpin);if (ch == '=')cout << "<=" << "\t$运算符" << endl;else if (ch == '<')cout << "<<" << "\t$输出控制符" << endl;else if (ch == '>') cout << "<>" << "\t$运算符" << endl;else {cout << "<" << "\t$运算符" << endl;fseek(fpin, -1L, SEEK_CUR);}}break;default: cout << ch << "\t$无法识别字符" << endl;}}
}
int main()
{char fn[30];FILE *fpin;for (;;) {cout << "请输入文件名:" ;cin >> fn;fopen_s(&fpin, fn, "r");if (fpin != NULL) break;else cout << "文件路径错误!请输入源文件名(包括路径和后缀名):";}cout << "分析结果如下:" << endl;scan(fpin);fclose(fpin);return 0;
}

运行结果如下:

代码下载:http://download.csdn.net/detail/u014354193/9171573

编译原理(一)词法分析器相关推荐

  1. 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...

    <编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...

  2. 【编译原理】词法分析器语法分析器

    简单编译器设计 采用Java语言对C++语言进行编译,具体的简单编译器设计 词法分析器-扫描器的设计与实现 基本符号表 状态转换图 代码实现 import java.io.*; import java ...

  3. 编译原理之词法分析器随笔和简单实现

    借鉴:   编译原理之美. 极客时间上 什么是词法分析 编译原理:词法分析简单的来说就是在字符串中提取一系列的word单词. 编译器的眼里, 我们的一切输入都是什么? 都是一个一个的字符串. 所以编译 ...

  4. 编译原理——构造词法分析器(基于 Flex 构造和手工构造)

    文章目录 一.概述 二.基于 Flex 构造词法分析器 2.1 需求描述 2.2 编译流程 2.3 Flex 代码 三.手工构造词法分析器 3.1 需求描述 3.2 实现流程 3.3 C++ 代码 四 ...

  5. 编译原理实验 —— 词法分析器

    // Lexical_Analysis.cpp : 定义控制台应用程序的入口点. // #include "stdio.h" #include "stdlib.h&quo ...

  6. 编译原理,词法分析器

    简单的词法分析器 词法分析后的结果 词法分析的过程 词法分析程序 词法分析后的结果 对一个源程序进行词法分析,得到一个二元式,单词的符合,以及对应的内码值 词法分析的过程 程序一开始的时候,先对那些常 ...

  7. 我看过的编译原理方面的好文章

    本文不定期更新,最后更新于2019-7-6 编译原理 编译原理三大经典书籍(龙书 虎书 鲸书) 前端为什么要会正则表达式 - 知乎 一次性搞懂JavaScript正则表达式之引擎 - 掘金 没有AST ...

  8. 编译原理——词法分析

    根据上课内容顺序写的博客,并不是按照书的目录来的 使用龙书以及编译程序设计原理(第二版)金成植.金英编著 老师的PPT是英文的,我自己随便翻的,不一定对 文章目录 词法分析(scanning) 概述 ...

  9. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

  10. 编译原理——词法分析器

    采用java图形化界面编写了java语言的词法分析器,该分析器可识别所有java关键字.软件工程课程中编译原理实验. Keyword.jvav package org.kyc.test1;public ...

最新文章

  1. swaagerui2 与guava_Swagger使用总结
  2. 160个Crackme044
  3. 产品经理这个角色真的泡沫越来越大吗?
  4. 【转】Nginx服务器的反向代理proxy_pass配置方法讲解
  5. P4852-yyf hates choukapai【单调队列优化dp】
  6. 开发人员转售前工程师_工程师和营销人员可以从中学到什么
  7. HTML5 画布变换
  8. 人工智能如何改变农业?这是五大类创业公司全图
  9. 作为面试官,最近面试 Java 后端的感受!
  10. jvm调优工具_高级程序员必会的5个JVM性能监控、调优工具使用详解
  11. 196.删除重复的电子邮箱
  12. button3 电脑上mouse,鼠标侧键设置工具(X-Mouse Button Control)
  13. 用好这 43 款 Chrome 插件,让你开发学习一下子好轻松!
  14. 600度近视眼恢复方法_600度的近视眼,恢复视力要注意
  15. 银行数字化转型导师坚鹏:金融科技助力普惠金融新成效课程结束
  16. k8s节点NotReady问题定位
  17. QIIME 2:可重复、交互和扩展的微生物组数据分析流程
  18. win10无法登录Microsoft账号(登录页面无法加载)
  19. idea配置翻译插件(google翻译插件)
  20. Packet Tracer - 配置 EtherChannel

热门文章

  1. 清华应届硕士炮轰字节:恶意低薪2万/月,硕士不如本科还倒贴
  2. 震惊!!黑鲨手机的Android系统解锁密码竟然是123456
  3. Linux 用户管理 (useradd 、userdel、usermod、passwd,chage)
  4. 应用小波图像去噪的Matlab 实现
  5. 苹果更新系统服务器,苹果发布紧急公告:11月3日前部分设备不更新系统将停止部分服务...
  6. 小白笔记:linux学习
  7. 如何把查询出的结果按姓氏笔画排序
  8. 迷宫问题(八方向)c++
  9. 加减交替法(不恢复余数法)
  10. Apache Dubbo的爱奇艺之旅