实验要求:
[实验项目]
以下为正则文法所描述的 C 语言子集单词符号的示例,请补充单词符号:++,--,>>,
<<, += , -= ,*=, /= ,&&(逻辑与),||(逻辑或),!(逻辑非)等等,给出补充后描述 C 语言
子集单词符号的正则文法,设计并实现其词法分析程序。
<标识符>→字母︱<标识符>字母︱<标识符>数字
<无符号整数>→数字︱<无符号整数>数字
<单字符分界符> →+ ︱-︱* ︱;︱,︱(︱) ︱{︱}
<双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<感叹号>=︱<等于>=︱<斜竖>*
<小于>→< <等于>→=<大于>→><斜竖> →/
<感叹号>→!
该语言的保留字:void、int、float、double、if、else、for、do、while 等等(也可补
充)。
[设计说明]
(1)可将该语言设计成大小写不敏感,也可设计成大小写敏感,用户定义的标识符最
长不超过 32 个字符;
(2)字母为 a-z A-Z,数字为 0-9;
(3)可以对上述文法进行扩充和改造;
(4)“/*……*/”和“//”(一行内)为程序的注释部分。
[设计要求]
(1)给出各单词符号的类别编码;
(2)词法分析程序应能发现输入串中的错误;
(3)词法分析作为单独一遍编写,词法分析结果为二元式序列组成的中间文件;
(4)设计两个测试用例(尽可能完备),并给出测试结果。
[任务分析]
重点解决正则文法到状态转换图的转化问题,词法分析程序的实现。
实验过程:
1、文法扩充修改
(1)、其中我将每个单字符作为一种类别进行分析;
(2)、加入了保留字 main;
(3)、扩充双字符,并将每一个种类的双字符作为一种类别;
(4)、加入左右注释和单行注释。
扩充修改后的文法:
<标识符>→字母︱ 字母<标识符>︱ <标识符>数字
<无符号整数>→数字︱数字 <无符号整数>
<单字符分界符> →; ︱, ︱(︱) ︱{︱}
//每种运算符都有自己的意义,就跟保留字一样,应当单独分类