一、实验目的
掌握计算机语言的词法分析程序的开发方法。
二、实验内容
编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
三、实验要求
1、根据以下的正规式,编制正规文法,画出状态图;
标识符
<字母>(<字母>|<数字字符>)*
0 | ((1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*) 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* + - * / > < = ( ) ; if then else while do
十进制整数 八进制整数 十六进制整数 运算符和界符 关键字
2、根据状态图,设计词法分析函数int scan( ),完成以下功能:
1) 从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2) 以二元式形式输出单词<单词种类,单词属性>
其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数
运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下:
标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空
3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。
四、实验环境
PC微机
DOS操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
五、实验步骤
1、 根据正规式,画出状态转换图;
字母123其他符号字母或数字其他符号数字67890数字字符a字符b字符c字符a45
2、 根据状态图,设计词法分析算法;
‘=’ 3、 采用C或C++语言,设计函数scan( ),实现该算法; 4、 编制测试程序(主函数main);
5、调试程序:读入文本文件,检查输出结果。 部分代码如下: void scan(){ sourceFile = fopen(\"program.txt\// 以读取方式打开源文件 if( sourceFile == NULL) {
printf(\"file open error\\n\"); exit(0); } outputFile = fopen(\"result.txt\// 以写方式打开输出文件 if(outputFile==NULL) { printf(\"file open error\\n\"); exit(0); } ch = fgetc(sourceFile); // 读取字符 while(ch != EOF) { // 标识符以字母或下划线开头 if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z') || ch=='_' ) isKeyword(); if(ch>='0'&& ch<='9') isNumber(); else isOthers(); }
fclose(sourceFile); fclose(outputFile); }
//============================ void isKeyword() { int i=0, j=0, k=0; int flag = 0; for(k=0; k<30; k++) name[k]='\\0'; // 初始化变量名 while(((ch>='a') && (ch<='z')) ||((ch>='A') && (ch<='Z')) || ch=='_' || (ch>'0' && ch<'9')) }
六、测试数据
输入数据:
编辑一个文本文件program.txt,在文件中输入如下内容:
if data+92>0x3f then data=data+01; else data=data-01; 七.实验报告要求 实验报告应包括以下几个部分: 1、词法的正规式描述; 2、变换后的 状态图; 3、词法分析程序的数据结构与算法。 八.考题 1、 词法分析能否采用空格来区分单词? 答:不能。程序中分割单词的不仅仅是空格,还可以是+,-,*,/,>,<,(,……等运算符或界定符。 2、 程序设计中哪些环节影响词法分析的效率?如何提高效率? 答:例如在判断是否为关键字时,方法是把单词全部读取并存放在一个字符数组后再逐个与关键字表匹配,这样做可能效率比较低,若能在读取的同时判断可能会提高效率。 九.心得体会 这次实验算是编译原理的第一个实验吧,当然第一个就有点复杂了,程序 scan() 函数读入文本内容,设置默认的运算符和界符,关键字数组。读入字符接下来便是一步一步的判断方法,也就是根据状态转换图并结合下一个字符来判断程序的转向,匹配成功便根据设定格式输出。 因篇幅问题不能全部显示,请点此查看更多更全内容