本实验为大连理工大学软件学院编译技术课程的一部分,旨在通过实践加深学生对词法分析的理解与掌握。参与者将运用所学知识编写程序,完成指定任务,提升编程技巧和问题解决能力。
大连理工大学软件学院编译技术课程的词法分析上机实验旨在通过一次扫描完成对循环语句和条件判断语句的词法分析程序编写(使用C++实现)。具体要求如下:
1. 关键字包括:for, if, then, else, while 和 do,所有关键字均为小写。
2. 运算符和分隔符有:: = + - * / < > <= <> >= ; ( ) #。
3. 其他标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=字母(letter | 数字)*
NUM=数字数字*
4. 空格由空白、制表符和换行符组成,通常用来分隔不同的词法单元,在词法分析阶段会被忽略。
5. 各种词法单元对应的记号如下:
| 词法单元 | 记号 |
|----------------|----------|
| for | 1 |
| if | 2 |
| then | 3 |
| else | 4 |
| while | 5 |
| do | 6 |
| letter(letter+digit)* | 10 |
| digit digit* | 11 |
|= | 25 |
|; | 26 |
|( | 27 |
|) | 28 |
词法分析程序的功能是将源程序作为输入,输出为二元组(记号, 属性值/其在符号表中的位置)构成的序列。例如:对源程序 x:=5; if (x>0) then x:=2*x+1/3; else x:=2/x; # 经词法分析后应输出如下序列:
(10,x)
(18, :=)
(11, 5)
(26, ;)
...
几点说明:
(1)关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时查此表。如能匹配,则该单词为关键词;否则为一般标识符。
关键表描述如下:char *keyword[6]={for, if, then ,”else”,while, do};
(2) 程序中需要用到的主要变量有 token, id 和 num:
1)id 用来存放构成词法单元的字符串;
2)num 用来存放整数(可以扩展到浮点数和科学计数法表示);
3)token 用于存放词法单元对应的记号。参考代码如下:
do{
lexical(); // 将当前词法单元对应的记号保存至 token 中,属性值保存至 num 或 id 中
switch(token) {
case 11: printf((token, %d\n), num); break;
case -1: printf(error!\n);break;
default: printf((%d,%s)\n, token, id);
}
}while (token!=0);