资源描述:
《编译程序的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、小型编译程序的设计与实现本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码(四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分1.词法分析器设计词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别编码,单词自身的值)由于我们规定的程序语句中涉
2、及单词较少,故在词法分析阶段忽略了单词输入错误的检查。1.1单词符号的内部定义及在编译程序中的定义我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、then、do等)、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如下:符号种别编码说明sy_if0保留字ifsy_then1保留字thensy_else2保留字elsesy_while3保留字whilesy_begin4保留字beginsy_do5保留字dosy_end6保留字enda7赋值语句semicolon8“;”e9布尔表达式Jinghao
3、10“#”S11语句L12复合语句Tempsy15临时变量EA18Band(即布尔表达式中的B∧)EO19Bor(即布尔表达式中的B∨)Plus34“+”Times36“*”Becomes38“:=”赋值Op_and39“and”Op_or40“or”Op_not41“not”Rop42关系运算符Lparent48“(”Rparent49“)”Ident56变量Intconst57整常量#include"stdio.h"/*如果使用TC的话,需要配置头文件路径*/#include"string.h"#defineACC-2/*******
4、*****************/#definesy_if0#definesy_then1#definesy_else2#definesy_while3#definesy_begin4#definesy_do5#definesy_end6#definea7#definesemicolon8#definee9#definejinghao10#defineS11#defineL12#definetempsy15#defineEA18/*Eand*/#defineE019/Eor*/#defineplus34#definetimes36#de
5、finebecomes38#defineop_and39#defineop_or40#defineop_not41#definerop42#definelparent48#definerparent49#defineident56#defineintconst571.2变量及数据结构说明编译程序中涉及到的变量及数据结构说明如下:charch=' ';/*从字符缓冲区读取当前字符*/intcount=0;/*词法分析结果缓冲区计数器*/staticcharspelling[10]={""};/*存放识别的字*/staticcharline
6、[81]={""};/*一行字符缓冲区,最多80个字符*/char*pline;/*字符缓冲区指针*/staticcharntab1[100][10];/*变量名表,共100项,每项长度10*/structntab{inttc;/*真值*/intfc;/*假值*/}ntab2[200];/*在布尔表达式E中保存有关布尔变量的真、假值*/intlabel=0;/*指向ntab2的指针*/structrwords{charsp[10];intsy;};/*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/structrwordsreswor
7、ds[10]={{"if",sy_if},{"do",sy_do},{"else",sy_else},{"while",sy_while},{"then",sy_then},{"begin",sy_begin},{"end",sy_end},{"and",op_and},{"or",op_or},{"not",op_not}};/*保留字表初始化,大小为10*/structaa{intsy1;/*存放单词的种别编码*/intpos;/*存放单词自身的值*/}buf[1000],/*词法分析结果缓冲区*/n,/*读取二元式的当前字符*/n1
8、,/*当前表达式中的字符*/E,/*非终结符*/sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/ibuf[100],/*算术或布尔表达式使用的缓冲区*/
stack[100