编译原理实验一词法分析实验报告 下载本文

专题 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 vTable ); 功能:

将结果输出到文件中