编译原理-实验一.docx

编译原理-实验一.docx

ID:54976167

大小:96.92 KB

页数:31页

时间:2020-04-25

编译原理-实验一.docx_第1页
编译原理-实验一.docx_第2页
编译原理-实验一.docx_第3页
编译原理-实验一.docx_第4页
编译原理-实验一.docx_第5页
资源描述:

《编译原理-实验一.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、实验一编译程序的分析与验证一、实验目的了解编译程序中LR分析表的作用以及语义加工程序的功能二、实验内容(1)验证下述程序的正确性while(a<=b)dobeginifm>=nthena:=a+1elseifj>itheni=i+jelsewhilek=hdox:=x+2;m:=n+m+x+y+n*m+x*yend#~三、编译程序理解输入文件名,取一个字符,程序扫描,词法分析结果打印,变量名表打印,语句分析栈初始化,符号栈初始化,四元式空白初始化,状态栈加工过程及归约顺序,读结果缓冲区中字符到当前字符中,语句分析,四元式分析结

2、果打印,程序运行结束。具体函数功能介绍:charch='';//可用于存放读出的一个字符intcount=0;//词法分析结果缓冲区计数器staticcharspelling[10]={""};//存放是别的字staticcharline[81]={""};//一行字符缓冲区char*pline;//line的指针staticcharntab1[100][10];//变量类型名表structntab{inttc;//真intfc;//假}ntab2[200];//用于存放布尔表达式的值intlabel=0;//指向ntab

3、2的指针structrwords{charsp[10];intsy;};//匹配表结构体structrwordsreswords[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}};//初始化匹配表,用于关键字的匹配structaa{intsy1;//存放变量

4、的类型名intpos;//存放该变量在自己表中的位置}buf[1000],//词法分析结果缓冲区n,//存放二元式当前字符n1,//表达式当前的字符E,//非终结符sstack[100],//算术表达式和布尔表达式的符号栈ibuf[100],//算术表达式和布尔表达式的缓冲区stack[1000];//语法分析的符号栈structaaoth;//四元式中没有填写的空白位置structfourexp//四元式结构体{charop[10];structaaarg1;structaaarg2;intresult;}fexp[200]

5、;intssp=0;//指向sstack的指针structaa*pbuf=buf;//词法分析结果缓冲区的指针intnlength=0;//词法分析中记录单词的长度intlnum=0;//行数计数源程序inttt1=0;//变量类型名表的指针FILE*cfile;//源程序文件/********************************************************/intnewt=0;//临时变量计数器intnxq=100;//总是指向下一个要形成的四元式每次执行gen()intlr;//用于存放ac

6、tion1中的当前状态intlr1;//用于存放action2,3中的当前状态intsp=0;//LR分析表栈顶指针intstack1[100];//状态栈1intsp1=0;//状态栈的指针intnum=0;//算术表达式或布尔表达式的指针structll{intnxq1;//指向下一条四元式的指针inttc1;//真值链intfc1;//假值链}labelmark[10];//记录嵌套中每层布尔表达式e的首地址intlabeltemp[10];//记录每层else之前四元式的地址intpointmark=-1,pointt

7、emp=-1;//labelmark的指针,labelmark的指针intsign=0;//sign=1赋值语句,sign=2while语句,sign=3if语句构造程序语句的LR分析表算术表达式的LR分析表布尔表达式的LR分析表readline()//读一行{charch1;pline=line;ch1=fgetc(cfile);//从文件中取一个while((ch1!='')&&(ch1!=EOF))//把字符缓冲区填满{*pline=ch1;pline++;ch1=fgetc(cfile);}*pline='';

8、//结尾终结符pline=line;//字符缓冲区指针重新回到字符缓冲区的第一个字符位置}/**********************从缓冲区读取一个字符*********************/readch()//读一个{if(ch=='')//读到尾姐再来一行,行

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。