1、编译原理课程设计报告目 录一、课程设计的目的2二、课程设计的要求2三、课程设计报告内容2四、实验运行环境2五、实验设计步骤2六、变化后的正规文法2七、状态图3八、基本测试数据4九词法分析程序的数据结构与算法 4十、实验结果截图12十一、设计结果及体会12十二、参考文献12一、课程设计的目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、课程设计要求1根据以下的正规式,编制正规文法,画出状态图;标识符 (|)*十进制数 (0 | 1|2|3|4|5|6|7|8|9)(0|1|2|3|
2、4|5|6|7|8|9)*(|.)(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)* (|.)(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)* (|.)(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)*运算符和分隔符 + - *
3、/ = ( ) ;关键字 if then else while do 2根据状态图,设计词法分析函数int scan( ),完成以下功能:1)从键盘读入数据,分析出一个单词。2)返回单词种别(用整数表示),3)返回单词属性(不同的属性可以放在不同的全局变量中)。3编写测试程序,反复调用函数scan( ),输出单词种别和属性。三、 课程设计报告内容编制一个能够分析三种数、标识符、主要运算符和主要关键字的词法分析程序。四、 实验运行环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、 实验设计步骤1.根据状态图,设计词法分析算法
4、2.采用C语言,设计函数scan( ),实现该算法3.编制测试程序(主函数main)。4.调试程序:输入一组单词,检查输出结果。六、变化后的正规文法:-(|)*- 0 - 0x -+| - |* |/ | |= |( | ) |;-if| then| else |while |do-a|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z-(0|1|2|3|4|5|6|7|8|9)|- (|.)-(0|1|2|3|4|5|6|7)|- (0|1|2|
5、3|4|5|6|7|8|9|a|b|c|d|e|f) |七、状态图图-1-空白 0-9/a-z/A-Z A-Z/a-z 其它 0-91-9 其它 0-9 非数字 0-7 0 0-7 非0-7且 0 0-7 x/X 非0-7 1-9/A-F/a-f 非(1-9/A-F/a-f) +1-111 0-9/A-F/a-f If/ while/ 非(1-9/A-F/a-f) then/ else/do八、 基本测试数据输入数据例: 0 58+data 0x2f 00 then; 正确结果:这些单词的单词种别及其属性 INT10 0 INT10 58 + _IDN data _INT16 47 INT8
6、0 Then -; -九、词法分析程序的数据结构与算法词法分析的算法思想主要是根据状态图来实现,由前面的状态图来进行结构的设计,具体细节请参见“图1”的图示。主要的数据结构如下所示:union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储char kind7; /类型即种别int id; /所属的具体类型即种别号union chars pro; /属性值;种别与种别号的对应关系如下表所示:种 别 种 别 号INT10 1INT8 2INT16 3标识符 4分
7、隔符 5关键字 6出 错 7REAL10 8REAL8 9REAL16 10完整代码如下:#include#includeunion chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union chars pro;int scan(char *a); /对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_l
8、ong);/将分析后的每个token输出void save(char *a,int id,int x);/将分析后的结果保存到一个结构数组中char nowChar15; /临时的存储单元,用来存储被空格打断以后单元char kinds118= ,INT10,INT8,INT16,IDN, , , ,REAL10,REAL8,REAL16;/单词的不同种别struct data link100; /用来存放词法分析以后的结果的结构数组int link_long=0; /全局变量int scan(char *a)int id;int a_long=0;int doc=0;while(*a!=NU
9、LL)nowChar0=0;a_long=0;doc=0;/对数值的判断及处理if(0=*a&*a=9) /如果第一个字符为数值nowChara_long=*a;*a+;a_long+;/对十六进制的判断及处理if(nowChar0=0&(*a=x|*a=X) /如果第一个字符为0且第二个字符为x,则为十六进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=9)|(a=*a&*a=f)|(A=*a&*a=F)|*a=.)nowChara_long=*a; /一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1
10、;*a+;a_long+;nowChara_long=0; /判断输入的十六进制数是否合法if(a_long=2) /输入的只有0x,则输入错误Prints(nowChar,7,a_long);return 0;if(doc) /输入的十六进制数是浮点型的Prints(nowChar,10,a_long); /则将其具体的类型属性定为10else /输入的十六进制数是整型的Prints(nowChar,3,a_long); /则将其具体的类型属性定义为3continue;/对八进制的判断及处理if(nowChar0=0&0=*a&*a=7) /如果第一个字符为0且第二个字符为07,则为八进制数
11、nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=7)|*a=.)nowChara_long=*a; /一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;if(doc) /输入的八进制数是浮点型的Prints(nowChar,9,a_long); /则将其具体的类型属性定为9else /输入的十六进制数是整型的Prints(nowChar,2,a_long); /则将其具体的类型属性定义为2continue;/对十进制数的判断及处理elsewhile(*a
12、!=NULL&(0=*a&*a=9)|*a=.)nowChara_long=*a; /一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;if(doc) /输入的十进制数是浮点型的Prints(nowChar,8,a_long); /则将其具体的类型属性定为8else /输入的十进制数是整型的Prints(nowChar,1,a_long); /则将其具体的类型属性定义为1continue; /完成了对数值的判断及处理/对字符的判断及处理elsenowChara_long=*a;*a+;a_long+;/判断输入的字符是否为运算符或其他的分隔符switch(nowChar0)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1