专题 1_ 词法分析程序构造原理与实现
李若森 13281132计科1301
一、 程序功能描述
[功能]:
完成下述正则文法所描述的C语言子集单词符号的词法分析程序。 [要求]: (1) 给出各单词符号的类别编码。 (2) 能发现输入串的错误。 (3) 将分析所得二元序列输出到中间文件中。 [文法]:
<标识符>→c|c<余留标识符> <余留标识符>→d|c
<无符号数>→d<余留无符号数>|.<小数部分>|d
<余留无符号数>→d<余留无符号数>|.<十进小数>|(E|e)<指数部分>|.|d <十进小数>→(E|e)<指数部分>|d<十进小数>|d <小数部分>→d<十进小数>|d
<指数部分>→d<余留指数>|(+|-)<整指数>|d <整指数>→d<余留整指数>|d <余留整指数>→d<余留整指数>|d <算数运算符>→+|-|*|/|++|-- <关系运算符>→>|<|==|>=|<=|!= <逻辑运算符>→!|&&|\\|\\| <位操作运算符>→>>|<<
<赋值运算符>→=|+=|-=|*=|/=|%= <特殊运算符>→,|\\(|\\)|{|} <分隔符>→;
保留字: void int float double if else for do while [说明]: (1) 该语言对大小写不敏感 (2) c代表字母a-z&&A-Z,d代表数字0-9。 (3) ?/*..*/?以及?//?为程序注释部分。 (4) 文法中‘\\’为转义字符
二、 主要数据结构描述
pair
用pair
元素的值。当类型号小于40时代表程序分界符,第二个元素不存储有效信息,用?-?代替;类型号为40时是标识符,第二个元素存储标识符字符串;类型号为41时代表实数,第二个元素存储的是该实数的二进制值。 vector<>:
vector是C++中的动态数组,用来存储每一行的二元组。
三、 程序结构描述
设计方法:
状态转换图:(DFA M)
0* = / % !12345=>> =<< =15&&||Character6, ) { } ;Character, Digit+789.+ =-- =E eDigitE eDigit1011+ -12Digit13.DigitDigitDigit14Digit
本实验将标识符分为以下几类
1. 算术运算符
+、-、*、/、%、++、-- 2. 关系运算符
>、<、==、>=、<=、!= 3. 逻辑运算符 !、&&、|| 4. 位操作运算符 <<、>> 5. 赋值运算符
=、+=、-=、*=、/=、%= 6. 特殊运算符 ,、(、)、{、} 7. 分隔符
;、/*、*/、// 8. 实数 9. 标识符 10. 保留字
void、int、float、double、if、else、for、do、while
需要识别的关键字及识别码
关键字 + - * / % ++ -- > < == >= <= != ! 识别码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 关键字 && || << >> = += -= *= /= %= , ( ) { 识别码 15 16 17 18 19 20 21 22 23 24 25 26 27 28 关键字 } ; void int float double if else for do while 标识符 正实数 识别码 29 30 31 32 33 34 35 36 37 38 39 40 41 函数定义:
getOutputName:
void getOutputName( char *inputName, char *outputName );
功能:
得到输出文件名 传入参数:
inputname:需处理的文件的文件名 传出参数:
Outputname:输出文件的文件名 返回值: (无)
errMsg:
void errMsg( string filename, int rowNo, int colNo, string errmsg ); 功能:
向屏幕输出错误信息 传入参数:
filename:正在处理的文件的文件名称 rowNo:出错行 colNo:出错列 errmsg:错误信息 传出参数: (无) 返回值: (无)
noteProcess:
bool noteProcess( string &str, bool ¬eflag ); 功能:
预处理,删除字符串内注释 传入参数:
str:需处理的字符串
Noteflag:该字符串是否处于多行注释中 传出参数:
str:处理过的字符串
noteflag:当前行是否处于多行注释中 返回值:
是否成功处理。如果注释匹配则返回true,否则返回false。
print:
void print( FILE *fp, vector
将结果输出到文件中