资源描述:
《小型编译程序高级语言到四元式的编译.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、小型编译程序:高级语言到四元式的编译#include"stdio.h"/*如果使用TC的话,需要配置头文件路径*/#include"string.h"#defineACC-2/************************/#definesy_if0#definesy_then1#definesy_else2#definesy_while3#definesy_begin4#definesy_do5#definesy_end6#definea7#definesemicolon8#definee9#defi
2、nejinghao10#defineS11#defineL12#definetempsy15#defineEA18/*Eand*/#defineE019/Eor*/#defineplus34#definetimes36#definebecomes38#defineop_and39#defineop_or40#defineop_not41#definerop42#definelparent48#definerparent49#defineident56#defineintconst57/**********
3、***********************/charch=' ';/*从字符缓冲区读取当前字符*/intcount=0;/*词法分析结果缓冲区计数器*/staticcharspelling[10]={""};/*存放识别的字*/staticcharline[81]={""};/*一行字符缓冲区,最多80个字符*/char*pline;/*字符缓冲区指针*/staticcharntab1[100][10];/*变量名表,共100项,每项长度10*/structntab{inttc;/*真值*/intf
4、c;/*假值*/}ntab2[200];/*在布尔表达式E中保存有关布尔变量的真、假值*/intlabel=0;/*指向ntab2的指针*/structrwords{/*存放临时变量的表的定义*/charsp[10];intsy;};/*(保留字表)匹配表的结构,用来与输入缓冲区中的单词进行匹配*//*匹配表初始化,大小为10*/structrwordsreswords[10]={{"if",sy_if},{"do",sy_do},{"else",sy_else},{"while",sy_while},{
5、"then",sy_then},{"begin",sy_begin},{"end",sy_end},{"and",op_and},{"or",op_or},{"not",op_not}};structaa{intsy1;/*存放名字*/intpos;/*存放名字所对应的地址*/}buf[1000],/*词法分析结果缓冲区*/n,/*读取二元式的当前字符*/n1,/*当前表达式中的字符*/E,/*非终结符*/sstack[100],/*算术或布尔表达式加工处理使用的符号栈*/ibuf[100],/*算术或布
6、尔表达式使用的缓冲区*/stack[1000];/*语法分析加工处理使用的符号栈*/structaaoth;/*四元式中空白位置*/structfourexp{charop[10];structaaarg1;structaaarg2;intresult;}fexp[200];/*四元式的结构定义*/intssp=0;/*指向sstack栈指针*/structaa*pbuf=buf;/*指向词法分析缓冲区的指针*/intnlength=0;/*词法分析中记录单词的长度*/intlnum=0;/*源程序行数记
7、数,源程序长度*/inttt1=0;/*变量名表指针*/FILE*cfile;/*源程序文件,~为结束符*//*FILE*mfile;*/intnewt=0;/*临时变量计数器*/intnxq=100;/*nxq指向下一个形成的四元式的地址*//*每次执行gen()时,地址自动增1*/intlr;/*扫描LR分析表1过程中保存的当前状态值*/intlr1;/*扫描LR分析表2或表3所保存的当前状态值*/intsp=0;/*查找LR分析表时状态栈的栈顶指针*/intstack1[100];/*状态栈1的定义
8、*/intsp1=0;/*状态栈1的栈顶指针*/intnum=0;/*算术或布尔表达式缓冲区指针*/structll{intnxq1;/*记录下一条四元式的地址*/inttc1;/*真值链*/intfc1;/*假值链*/}labelmark[10];/*记录语句嵌套层次的数组,*//*即记录嵌套中每层的布尔表达式E的首地址*/intlabeltemp[10];/*记录语句嵌套层次的数组,*//*即记录每层else之前的四元式地