编译原理词法语法语义分析器设计(4)
时间:2025-04-29
时间:2025-04-29
1. 扩充上述小语言的单词;
2. 增加语法分析器的功能,能识别条件语句和循环语句等; 3. 增加中间代码生成器的功能,能产生条件语句和循环语句等的中间代码(四元
式序列)
4. 增加报错功能;
5. 将中间代码翻译成汇编语言。
三、实现过程说明
给出各题目的详细算法描述,数据结构和函数说明,流程图。 (1) 词法分析器:
1算法描述:
词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号。通过DOS环境手动输入字符串序列(以’$’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略、回车换行符等字符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组。
具体思路如下: 首先建立关键字表,将关键字作为特殊标示符处理,把它们预先安排在char *keywords[13]中,将需要被识别出的关键字存入表中,当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
在主函数中让用户输入要识别的符号串,然后将输入的符号串读入到 program[500],遇$结束。再依次扫描program[500]中的每一个符号,调用Scan ()子函数分析每一个符号,再将分析的结果输出,也是遇$结束。
2函数说明和数据结构:
在Scan ()子函数中,先全部初始化,然后读一个字符,分析它是什么类型: 如果是字母类型,则接着往下读,直到读到非字母的字符,存入words[10]中,依次对比关键字表中的元素,如果相同,则将flags[]置为相应的种别码,如果全都扫描后没发现相同的关键字,则为普通的标识符,返回主函数输出。
如果是数字类型,首先分析第一个符号,接着读下一个字符串,直到读到一个不是数字的字符串位置,每读一个数字字符,就将他们转化为相应的数字,使用辗转相乘法,每次都让number先自乘10,然后加上这个数字,这样就将字符串表示的数字转化成了相应的数,返回主函数输出。
如果是其他单词表的符号,则将他们的flags[]置为相应的种别码,并将字符存到words[] 中返回主函数输出。
主要变量说明: 用words[10]存放构成单词符号的字符串,并且用于判断是否为关键字。flags[500] 存放单词符号的种别码。Number存放整数值,words[]存放标识符,关键字或者其他符号。cnt[num]按顺序存放读到的字符,为下面语义分析做准备。Status用于判断是否为关键字,1是,0不是。