




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语法分析实验报告一、 实验目的1. 编制一个递归下降分析程序。2. 加深对语法分析程序原理的理解。二、实验要求1.待分析的简单语言的语法用扩充的EBNF表示如下::=begin;end:=:=IDENT:=:=+|-(+|-):= (*|/):= IDENT | NUMBER | ()2.实验要求说明输入单词串,以“.”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,最好能指出错误原因。例如: 输入 begin a:=2*3 end.输入不能雷同 输出 success! 输入 begin x=4 end. 输出 error! 赋值语句左部标识符后面应是赋值号“:=”3.语法分析设计说明采用递归下降分析程序。为每个非终符编号一个子过程,各个非终结符过程调用关系如下:语句表达式项 因子三 实验设计思路1)主程序示意图图1 主程序示意图2)递归下降分析程序示意图图2 递归下降分析程序示意图3)语句串分析过程示意图图3 语句串分析过程示意图4)statement语句分析程序流程 图4 statement语句分析函数示意图 图5 expression表达式分析函数示意图 图6 term分析函数示意图图7 factor分析过程示意图四、实验输出结果1实验结果2源代码#include stdio.h#include #include /*变量说明: line从终端读入的字符串;当前所指位置在计数器 p token为存放的单词自身字符串;当前所指位置在计数器 m number整型常数 sym每个单词符号种类 */enum symbol period=0,ident,number, plus,minus,times,slash,eql,neq,lss,leq,gtr,geq,lparen,rparen,semicolon,becomes,beginsym,endsym,ifsym,thensym,whilesym,dosym,nil,;char line80,token8,ch;enum symbol sym;int p,m, num;char *rwtab6=begin,end, if,then,while,do;int Err;void getsym();int block();void statement();void expression();void term();void factor();void main()/读了字符串, 直到遇.结束p=0;printf(n please input a string(end with .): );doscanf(%c,&ch);linep+=ch; while(ch!=.);linep+=0;/逐个单词扫描;Err = 0;p=0;getsym();/当前扫描的单词存放在sym中block();if (sym=0)&(Err=0)printf(success!n);void printSym(int i)switch (i)case 0:/ 结束符.return;case 2: printf( %-5d%10d )n,sym,num);/NUMBERbreak;case 23:/printf(you have input a wrong stringn);break;default: printf( %-5d%10s )n,sym,token);break;void getsym()for(m=0; m8;m+) tokenm+=NULL;ch=linep+;m=0;while(ch= )|(ch=n)/略去空格,无效字符ch=linep+;/字母打头的字符串: 标识符if ( (ch=a) | (ch=A) while(ch=a) | (ch=A) | (ch=0 & ch=9) tokenm+=ch; ch=linep+;p-;sym = ident;tokenm+=0; /比较是否为保留字for (int i = 0; i =0)&(ch=0)&(ch=9) num=num*10+ch-0;ch=linep+;p-;sym = number;else switch(ch)case :/*赋值符号 */tokenm+=ch;ch=linep+;if (ch = =)sym = becomes;tokenm+=ch;elsesym = nil;break;case :/* = 和) tokenm+=ch;sym=neq; elsesym = lss;p-;break;case :/* = 和 符号 */tokenm+=ch;ch=linep+;if(ch =) sym=geq; tokenm+=ch; else sym=gtr;p-; break;case +: sym=plus; tokenm+=ch; break;case -: sym=minus; tokenm+=ch; break;case *: sym=times; tokenm+=ch; break;case /: sym=slash; tokenm+=ch; break; case =: sym=eql; tokenm+=ch; break;case (: sym=lparen; tokenm+=ch; break;case ): sym=rparen; tokenm+=ch; break;case ;: sym=semicolon; tokenm+=ch; break;case .: sym=period;tokenm+=ch;break;default:sym=nil;break;tokenm+=0;/printSym(sym);void error(int i)switch (i)case 1: printf(Error %d: 语句期望begin符号n, i);break;case 11: printf(Error %d: 语句期望end符号n, i);break;default:break;Err+;int block() if (sym != beginsym) error(1); else getsym();statement();while (sym = semicolon)getsym();statement();if (sym != endsym)error(11);getsym(); return 0;void statement() if(sym=ident) getsym(); if(sym=becomes) getsym(); expression(); else printf(Error!赋值语句左部标识符后面应是赋值号 :=n); return; else printf(错误的句子!n);return;if(sym = number) printf(你写了数字!n); return ;/* * TODO: 语句处理* */void expression()if(sym=plus|sym=minus)getsym();term();elseterm(); while(sym=plus|sym=minus) getsym(); term(); /* * TODO: 表达式处理* */void term() if(sym=times|sym=slash) getsym(); factor(); else factor(); while(sym=times|sym=slash) getsym(); factor(); /* * TODO: 项处理* */void factor()if(sym=ident|sym=number) get
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游系列面试题及答案
- 幼儿园小班美术《毛毛虫》教案
- java基础应聘面试题及答案
- 深山迷路测试题及答案
- 爱的教育朗诵
- 2025年高精度二维伺服系统项目立项申请报告模板
- 俄语会计面试题及答案
- 初级面试做java面试题及答案
- 2025年系列催化裂化催化剂项目立项申请报告
- 城南旧事考试题及答案
- 土木工程施工课程设计完整版
- 检修质量管理培训课件
- 2022年浙江农业博览会参展单位汇总表
- 货物签收单确认单
- 《走进民间音乐》资料
- 螺杆冷水机组使用说明书
- 非固化橡胶沥青防水涂料技术交底
- 讲稿董关鹏:如何面对媒体与公众
- 酒店治安保卫管理制度
- Q∕SY 06521-2016 炼油化工建设项目EPC总承包管理规范
- 课件心肺复苏(CPR)
评论
0/150
提交评论