实验一 简单的C语言词法分析器的实现
实验目的:
设计、编制并调试一个简单的c语言词法分析程序,加深对词法分析原理的理解
实验要求:
- 对单词的构词规则有明确的定义;
- 编写的分析程序能够正确识别源程序中的单词符号;
- 识别出的单词以(单词符号,种别码)的形式保存在符号表中;
- 词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。
实验分析:
- 待分析的简单的词法
- 关键字
if else while do for main return int float double char
所有的关键字都是小写。- 运算符
= + - * / % < <= > >= != = =
- 运算符
- 界限符
; ( ) { }- 常量
整形常量,通过以下正规式定义:
dight dight* - 标识符(ID),通过以下正规式定义:
letter (letter | digit)* - 空格有空白、制表符和换行符组成。空格一般用来分隔标识符、整数、运算符、界符和关键字,词法分析阶段被忽略。
- 常量
- 关键字
- 各种单词符号对应的种别码:
| 单词符号 | 类别码 | 单词符号 | 类别码 |
|---|---|---|---|
| main | 1 | >= | 16 |
| if | 2 | < | 17 |
| else | 3 | < = | 18 |
| wile | 4 | = = | 19 |
| do | 5 | != | 20 |
| for | 6 | = | 21 |
| return | 7 | ; | 22 |
| lettet(letter/digit)* | 8 | ( | 23 |
| dight dight* | 9 | ) | 24 |
| + | 10 | { | 25 |
| — | 11 | } | 26 |
| * | 12 | int | 27 |
| / | 13 | float | 28 |
| % | 14 | double | 29 |
| > | 15 | char | 30 |
分析:
- 只对于单词 数字等进行识别,不需要理解出意思。
- 在对关键字标识符单词进行识别时,单独申请了一个数组存放这些关键字;并识别这些单词,判断是哪一个标识符or关键字
- 整型常量也要注意整个数字的完整
- <= >= != 这种有两个符号的运算符,也要注意完整扫描
- 词法分析的代码主要参考了:https://www.cnblogs.com/coderkl/p/4320325.html
- 因为实验还要求文件的读写,遂自己补充了功能。
- 由于扫描结果输出的结果有int有char型变量,并且有的文件读写函数读一行、读一个单词、字母,写一个字符,等等诸如此类,非常不方便输出。最后一番调试,调用了fstream的头文件,通过”<<”这一字符以类似cout的方式非常方便地输出了结果(本质上还是太菜,对文件读写操作根本不熟
- 文件读写参考:https://www.cnblogs.com/forcheryl/p/3963550.html
代码
1 |
|