实验一、词法分析实验
商业软件工程专业 李锦旭 学号201506110131
一、 实验目的
通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。
二、 实验内容和要求
在原程序中输入源代码
- 对字符串表示的源程序
- 从左到右进行扫描和分解
- 根据词法规则
- 识别出一个一个具有独立意义的单词符号
- 以供语法分析之用
- 发现词法错误,则返回出错信息
在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。
- 识别关键字:main if int for while do return break continue,该类的单词码为1.
- 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
- 运算符:+、-、*、/、=、>、<、>=、<=、!=
- 分隔符:,、;、{、}、(、)
- 常数,如123,4587
各种单词符号对应的种别码。
输出形式:
- 二元式
– (单词种别,单词自身的值)
- 单词种别,表明单词的种类,语法分析需要的重要信息
– 整数码
- 关键字、运算符、界符:一符一码
- 标识符:10, 常数:11
- 单词自身的值
– 标识符token、常数sum
– 关键字、运算符、界符token
三、 实验方法、步骤及结果测试
- 源程序名:
可执行程序名:
- 原理分析及流程图
- 主要程序段及其解释:
实现主要功能的程序段,重要的是程序的注释解释。
void judge() { for (x = 0; x < 10; x++) //初始化token数组 { token[x] = NULL; } ch = str[i]; while (ch == ' ') //忽视空格 { i++; ch = str[i]; } x = 0; i++; if (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) //访问到字母 { while (((ch <= 'z') && (ch >= 'a')) || ((ch <= 'Z') && (ch >= 'A')) || ((ch >= '0') && (ch <= '9'))) { token[x] = ch; x++; ch = str[i]; i++; } i--; typenum = 10; for (n = 0; n < 6; n++) //判断是否是关键字 { if (strcmp(token, word[n]) == 0) { typenum = n + 1; break; } } } else if ((ch >= '0') && (ch <= '9')) //访问到数字 { while ((ch >= '0') && (ch <= '9')) { token[x] = ch; x++; ch = str[i]; i++; } i--; typenum = 11; } else { switch (ch) { case '<': token[x] = ch; x++; ch = str[i]; i++; if (ch == '=') { typenum = 21; token[x] = ch; x++; } else if (ch == '>') { typenum = 22; token[x] = ch; x++; } else { typenum = 20; i--; } break; case '>': token[x] = ch; x++; ch = str[i]; i++; if (ch == '=') { typenum = 24; token[x] = ch; x++; } else { typenum = 23; i--; } break; case '+': typenum = 13; token[x] = ch; x++; break; case '-': typenum = 14; token[x] = ch; x++; break; case '=': typenum = 25; token[x] = ch; x++; break; case '*': typenum = 15; token[x] = ch; x++; break; case '(': typenum = 27; token[x] = ch; x++; break; case ')': typenum = 28; token[x] = ch; x++; break; case ';': typenum = 26; token[x] = ch; x++; break; case '/': typenum = 16; token[x] = ch; x++; break; case '#': typenum = 0; token[x] = ch; x++; break; case ':': token[x] = ch; x++; ch = str[i]; i++; if (ch == '=') { typenum = 18; token[x] = ch; x++; } else { typenum = 17; i--; } break; default: typenum = -1; break; } } }
- 运行结果及分析
输入源代码:begin x:=9: if x>9 then x:=2*x; end #
结果分析:词法分析器正常运行,分析结果正确
四、 实验总结
通过编写出一个简易的词法分析程序,对自己的编程能力有了一个更好的理解了。