编译原理-语法分析器-仅供参考,不可滥用!.doc_第1页
编译原理-语法分析器-仅供参考,不可滥用!.doc_第2页
编译原理-语法分析器-仅供参考,不可滥用!.doc_第3页
编译原理-语法分析器-仅供参考,不可滥用!.doc_第4页
编译原理-语法分析器-仅供参考,不可滥用!.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

青岛理工大学课程实验报告课程名称编译原理班级实验日期姓名学号实验成绩实验名称实验二 语法分析实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。1 待分析的简单语言的语法用扩充的BNF表示如下:=beginend:=;:=:=ID:=:=+ | -:=* | /:=ID | NUM | ()2 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如: 输入 begin a:=9; x:=2*3; b:=a+x end # 输出 success! 输入 x:=a+b*c end # 输出 error实验环境1. Visual C+6.02. Win7/Windows XP实验内容 语法分析程序的算法思想:(1).主程序示意图(2).递归下降分析程序示意图(左)语法串分析程序示意图(右)(4)statement 语法分析程序流程图(左)expression表达式分析函数示意图(右)(3)term分析函数示意图(左)factor分析过程示意图(右)调试过程及实验结果1. 测试一输入begin x:=9; x:=2*3; b:=a+x;end ;# 后经语法分析输出如图所示:2. 测试二输入 x:=a+b*c end # 后经语法分析输出如图所示:3. 测试三输入 begin q:=6; d:=4; end #,经语法分析输出如图所示:4. 测试四输入 begin a:=4;b:=5;c:=a*b+a #,经语法分析输出如图所示:总结通过本次试验,我们设计出了一个比较符合要求的语法分析器,同时了解了语法分析的过程,其主程序大致流程为:“置初值”调用wordScanAnalyse函数读下一个单词符号调用IrParse结束。分析程序的各个判断条件可以知道,需要调用函数factor();expression();yucu();term();statement();lrparser();其中嵌套了条件语句使得拥有较为全面的处理机制,当程序不以“begin”开头,或不以“end #”结尾,都会提示错误类型,同时还有表达式,赋值号的条件判断等。综上所说,需要考虑的情况很多,所以说一个规范的语法分析程序可不是简简单单就能完成的.附录(源代码)#include /头文件声明#include /头文件声明#define KEY_WORD_END key word end/定义关键字结束标志#define KEY_WORD_SIZE 6 /定义关键字表中的关键字数目char input255;/*字符输入缓冲区*/char token255;/*单词缓冲区-用来存放构成单词符号的字符串*/char *rwtab=begin,if,then,while,do,end,KEY_WORD_END;/关键字表char ch;/*字符*/int syn;/*单词符号种别码*/int sum;/*存放整数型单词*/int w_length;/*所读取的单个单词长度*/int s_length;/*当前所读取的字符串长度*/int n;/定义简单变量int kk;/判断语句是否正确的标记位/方法声明factor();expression();yucu();term();statement();lrparser();wordScanAnalyse();int IsLetter(char c)/判断是否为字母 if(c=a)|(c=A)return 1; elsereturn 0;int IsDigit(char c)/判断是否为数字 if(c=0&c=9) return 1; else return 0;int IsBlankSpaceOrNextLine(char c)/判断接是否为空格或换行符if(c= |c=n)return 1;elsereturn 0;void retract()/回退一个字符s_length-; lrparser()/递归下降分析方法 if(syn=1) wordScanAnalyse();/*读下一个单词符号*/ yucu(); /*调用yucu()函数;*/ if (syn=6) wordScanAnalyse();if (syn=0)&(kk=0)printf(tSuccess!n);elseprintf(t 请注意“end”的书写位置!n); else if(kk!=1) printf(t The String Have Not Got An end!n); kk=1; else printf(t Haven Not Got A begin!n); kk=1; return; yucu() statement(); /*调用函数statement();*/ while(syn=26) wordScanAnalyse(); if(syn!=6) statement(); return; statement() if(syn=10) wordScanAnalyse(); if(syn=18) wordScanAnalyse(); /*读下一个单词符号*/ expression(); else printf(tSorryt赋值号错误!n); kk=1; else printf(tSorryt语句错误!n); kk=1; return; expression() term(); while(syn=13)|(syn=14) wordScanAnalyse(); /*读下一个单词符号*/ term();/*调用函数term();*/ return; term() factor(); while(syn=15)|(syn=16) wordScanAnalyse(); /*读下一个单词符号*/ factor();/*调用函数factor(); */ return; factor() if(syn=10)|(syn=11) wordScanAnalyse(); else if(syn=27) wordScanAnalyse(); /*读下一个单词符号*/ expression(); /*调用函数expression();*/ if(syn=28) wordScanAnalyse(); /*读下一个单词符号*/ else printf(t Error !n); kk=1; else printf(Sorryt 表达式错误!n); kk=1; return;int wordScanAnalyse()/*单词扫描分析方法*/ sum=0; for(w_length=0;w_length7;w_length+)tokenw_length+=NULL;ch=inputs_length+;w_length=0; while(IsBlankSpaceOrNextLine(ch)ch=inputs_length+; if(IsLetter(ch)/判断以字母开头的字符串 while(IsLetter(ch)|IsDigit(ch) tokenw_length+=ch;ch=inputs_length+; retract(); syn=10; tokenw_length+=0; for(n=0;nKEY_WORD_SIZE;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(IsDigit(ch)/判断以数字开头的字符串 while(IsDigit(ch) sum=sum*10+ch-0;ch=inputs_length+;retract();syn=11; else switch(ch)/判断其他字符 case ) syn=21; else syn=20; retract();/回退一个字符 break; case : ch=inputs_length+; if(ch=) syn=24; else syn=23; retract(); break; case +: ch=inputs_length+; if(ch=+) syn=1313; else syn=13; retract(); break; case -:ch=inputs_length+;if(ch=-) syn=1414; else syn=14; retract(); break; case !:ch=inputs_length+;if(ch=) syn=3125;else syn=31; retract();break; case =:ch=inputs_length+;if(ch=) syn=2525; else syn=25; retract(); break; case :ch=inputs_length+;if(ch=) syn=18; else syn=17; retract(); break; case *: syn=15;break; case /: syn=16;break; case (: syn=27;break; case ): syn=28;break; case : syn=5;break; case : syn=6;break; case ;: syn=26;break; case : syn=30;break; case #: syn=0;break; default: syn=-1;break; tokenw_length+=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论