实验二:语法分析(递归下降法).doc_第1页
实验二:语法分析(递归下降法).doc_第2页
实验二:语法分析(递归下降法).doc_第3页
实验二:语法分析(递归下降法).doc_第4页
实验二:语法分析(递归下降法).doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

实验二:语法分析(递归下降法)一、实验目的1、掌握语法分析的基本原理;2、掌握递归下降的分析法;3、熟悉C语言程序设计。二、实验准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C+。三、实验时间 2学时四、实验内容已给语言文法,写出该文法的递归下降法语法分析器。输入:源符号串。 输出:语法是否合法。 :文法:(1) := beginend(2) := ;(3) := (4) := ID:=(5) := +|-(6) := *|/(7) := ID|NUM|()五:源程序:lrparser()对应 yucu() 对应 statement() 对应 expression()对应 term() 对应 factor() 对应 关键字,数字,字母,符号对应码如下begin, if, then, while, do, end 16字母 10 数字11+,-,*,/,:,:=,=,=,;,(,),# 1328,0factor() #include stdio.h#include string.hchar prog80, token8;char ch;int syn, p, m, n, sum, kk=0;char *rwtab6=begin, if, then, while, do, end;void scaner();void lrparser();void yucu();void statement();void expression();void term();void factor();void main() p=0; printf(Please input string:n); do scanf(%c, &ch); progp+=ch; while(ch!=#); /当遇到#,结束输入 p=0; scaner(); lrparser();void scaner() for(n=0; n=A&ch=a&ch=A&ch=a&ch=0&ch=9) tokenm+=ch; ch=progp+;/将prog数组的字母复制到ch数组中 tokenm+=0; /把token的末尾设置结束符0 p-;/标记到当前token数组中不是字母的当前位置 syn=10; /标记字母的对应码 for(n=0; n=0&ch=0&ch=9) sum=sum*10+ch-0; /number用来记录所对应的数字 ch=progp+; p-; syn=11; /标记数字的对应码 else switch(ch) case ) syn=21; /标记”的对应码 tokenm+=ch; else if(ch=) syn=22; /标记”=”的对应码 tokenm+=ch; else syn=20; /标记”: tokenm+=ch; ch=progp+; if(ch=) syn=24; /标记”=”的对应码 tokenm+=ch; else syn=23; /标记”的对应码 p-; break; case : tokenm+=ch; ch=progp+; if(ch=) syn=18; /标记”:=”的对应码 tokenm+=ch; else syn=17; /标记”:”的对应码 p-; break; case +: syn=13; /标记”+”的对应码 tokenm+=ch; break; case -: syn=14; /标记”-”的对应码 tokenm+=ch; break; case *: syn=15; /标记”*”的对应码 tokenm+=ch; break; case /: syn=16; /标记”/”的对应码 tokenm+=ch; break; case =: syn=25; /标记”=”的对应码 tokenm+=ch; break; case ;: syn=26; /标记”;”的对应码 tokenm+=ch; break; case (: syn=27; /标记”(”的对应码 tokenm+=ch; break; case ): syn=28; /标记”)”的对应码 tokenm+=ch; break; case #: syn=0; /标记”#”的对应码 tokenm+=ch; break; default: syn=-1; /当不是上述字母,数字,符号时,设置syn=-1 tokenm+=0; void factor()/因子 if(syn=10 | syn=11) /当扫描的是数字或字母时,继续扫描 scaner(); else if(syn=27) /当扫描的(时,继续扫描 scaner(); expression(); if(syn=28) /当扫描的是)时,继续扫描 scaner(); else kk=1; printf(ERROR: )错误n);/表达式缺乏),出错 else kk=1; printf(ERROR: 表达式错误n);/扫描表达式,表达式开头不是(,出错 void term()/项 factor(); while(syn=15 | syn=16) /当开头扫描的是*或/时,继续扫描 scaner(); factor(); void expression()/表达式 term(); while(syn=13 | syn=14) /当开头扫描的是+或-时,继续扫描 scaner(); term(); void statement()/语句 if(syn=10) /当开头扫描的是字母时,继续扫描 scaner(); if(syn=18) /扫描的是:=时,继续扫描 scaner(); expression(); else kk=1; printf(ERROR: 赋值号错误n);/当扫描的是:=,出错 else kk=1; printf(ERROR: 语句错误n); void yucu()/语句串 statement(); while(syn=26) /当开始扫描到的是;,继续扫描 scaner(); statement(); void lrparser()/程序 if(syn=1) /当开头扫描的是begin时,继续扫描 scaner(); yucu(); if(syn=6) scaner(); if(syn=0 & kk=0) /当数字串的最后扫描的是#,而且并无出错,分析成功 printf(success!n); else if(syn!=0 & kk=0) kk=1; printf(ERROR: END后未正常结束

温馨提示

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

评论

0/150

提交评论