语法分析器实验报告_第1页
语法分析器实验报告_第2页
语法分析器实验报告_第3页
语法分析器实验报告_第4页
语法分析器实验报告_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、词法分析器实验报告实验名称:语法分析器实验内容:利用LL (1)或LR (1)分析语句语法,判断其是否符合可识别语法。学会根据 状态变化、first、follow或归约转移思想构造状态分析表,利用堆栈对当前内容进行有效判 断实验设计:实现功能可对一段包含加减乘除括号的赋值语句进行语法分析,其必须以$为终结符,语句间以; 隔离,判断其是否符合语法规则,依次输出判断过程中所用到的产生式,并输出最终结 论,若有错误可以报错并提示错误所在行数及原因实验步骤设计文法消除左递归提取公共左因子求first,follow*构造分析表*设计程序编写程序算法与数据结构LLtable:left记录产生式左端字符;r

2、ight记录产生式右端字符;ln记录产生式右端字 符长度Status:记录token分析情况Token: category,类型;value,具体内容根据LL (1)算法,手工构造分析表,并将内容用数组存储,便于查找先将当前语句的各token按序存储,当前处理语句最后一个token以#标记,作为输 入流与产生式比较,堆栈中初始放入#,x,a为处理输入流中当前读头内容/ 若top=a= # 表示识别成功,退出分析程序/ 若top=a! = # 表示匹配,弹出栈顶符号,读头前进一个/ 若top为i或n,但top! =a,出错,输出当前语句所在行,出错具体字符/ 若top不为i或n,查预测分析表,若

3、其中存放关于top产生式,则弹出top, 将产生式右部自右向左压入栈内,输出该产生式,若其中没有产生式,出错, 输出当前语句所在行,出错具体字符以;作为语句终结,每次遇到分号则处理之前语句并清空后预备下语句处理,当遇 至U$表示该段程序结束,停止继续处理分析表构造过程x-i=ee-e+t|e-t|tt-t*f|t/f|ff-(e)|i|nnote: i表示变量,n表示数字,!表示空串提取左公因子x-i=ee-ea|ta-+t|-tt-tb|fb-*f|/ff-(e)|i|n消除左递归x-i=e e-tcc-ac|!a-+t|-tt-fdd-bd|!b-*e|/ff-(e)|i|n5.类d) F

4、IRST & FOLLOWFIRST(x)=iFOLLOW(x)=#FIRST(e)=(,i,nFOLLOW(e)=札)FIRST(t)=(,i,nFOLLOW(t)=札+,-, )FIRST(c)=+,-,!FOLLOW(c)=札)FIRST(a)=+,-FOLLOW(a)=札+,-, ) FIRST(f)= (,i,nFOLLOW(f)=札+,-,/,*FIRST(d)=*,/,!FOLLOW(d)=#,+,-,) FIRST(b)=*,/FOLLOW(b)=札+,-,/,*e)分析表012345678+-*/()in#0 xx-i=e1ee-tce-tce-tc2cc-acc-acc-!

5、c-!3aa-+ta-t4tt-fdt-fdt-fd5dd-!d-!d-bdd-bdd-!d-!6bb-*fb-/f7ff-(e)f-nclass parserpublic:LLtable table100100;void scanner();parser(istream& in);int getLine() const;/LL(1)表扫描输入流中内容并分析/初始化,得到输入文件地址得到当前行数分析语法/分析堆栈/建立LL (1)表取字符所在表中行/取字符所在表中列输入流插入当前tokenprivate:int match();stack proStack;void constructTabl

6、e();int getRow(char ch);int getCol(char ch);istream* pstream;void insertToken(token& t);status getToken(token& t);int getChar();int peekChar();void putBackChar(char ch);void skipChar();void initialization();int line;token tokens1000;int counter;6.主要代码/找到 token得到当前字符下一个字符将字符放回跳过当前字符/初始化堆栈等当前行数字符表记录当前

7、字符表使用范围/建立LL (1)表void parser:constructTable()for (int i=0;i8;i+)for (int j=0;j9;j+)tableij.left=;for (int k=0;k3;k+)tableij.rightk=;table06.left=x;table06.ln=3;table06.right0=i;table06.right1=;table06.right2=e;table14.left=e;table14.ln=2;table14.right0=t;table14.right1=c;table16.left=e;table16.ln=2;

8、table16.right0=t;table16.right1=c;table17.left=e;table17.ln=2;table17.right0=t;table17.right1=c;table20.left=c;table20.ln=2;table20.right0=a;table20.right1=c;table21.left=c;table21.ln=2;table21.right0=a;table21.right1=c;table25.left=c;table25.ln=0;table25.right0=!;table28.left=c;table28.ln=0;table28

9、.right0=!;table30.left=a;table30.ln=2;table30.right0=+;table30.right1=t;table31.left=a;table31.ln=2;table31.right0=-;table31.right1=t;table44.left=t;table44.ln=2;table 44.right0=f;table44.right1=d;table46.left=t;table46.ln=2;table 46.right0=f;table46.right1=d;table47.left=t;table47.ln=2;table 47.rig

10、ht0=f;table47.right1=d;table50.left=d;table50.ln=0;table50.right0=!;table51.left=d;table51.ln=0;table51.right0=!;table52.left=d;table52.ln=2;table52.right0=b;table52.right1=d;table53.left=d;table53.ln=2;table53.right0=b;table53.right1=d;table55.left=d;table55.ln=0;table55.right0=!;table58.left=d;tab

11、le58.ln=0;table58.right0=!;table62.left=b;table62.ln=2;table62.right0=*;table62.right1=f;table63.left=b;table63.ln=2;table63.right0=/;table63.right1=f;table74.left=f;table74.ln=3;table74.right0=(; table74.right1=e;table74.right2=);table76.left=f;table76.ln=1;table76.right0=i;table77.left=f;table77.l

12、n=1;table77.right0=n;int parser:match()分析语法ofstream ofs(out.txt,ios:app);char a;int i=0;for (int p=0;pcounter;p+)couttokensp.value;ofstokensp.value;coutendl;ofsendlANALYSIS:endl;while(1)if(tokensi.category=n | tokensi.category=i)a=tokensi.category;elsea=(tokensi.value)0;if(a=proStack.top()if(a=#)cou

13、tThis is valid!endlendl;ofsThis is valid!endlendl;return 0;elseproStack.pop();i+;elseif(proStack.top() =n| proStack.top() =i)if(a!=#)coutERROR(LINE getLine() ): a cannot be matchedendl;ofsERROR(LINE getLine() ): a cannot be matchedendl;elsecoutERROR(LINE getLine() ): Unexpected endingendl;ofsERROR(L

14、INE getLine() ): Unexpected endingendl;coutThis is invalid!endlendl;ofsThis is invalid!endlendl;return 0;elseif(tablegetRow(proStack.top()getCol(a).left!=)char pst=proStack.top();int n=tablegetRow(pst)getCol(a).ln;int k=0;ofstablegetRow(pst)getCol(a).lefttablegetRow(pst)getCol(a).right0tablegetRow(p

15、st)g etCol(a).right1tablegetRow(pst)getCol(a).right20) /coutn tablegetRow(pst)getCol(a).rightn-1endl;proStack.push(tablegetRow(pst)getCol(a).rightn-1); n-;else if(a!=#)coutERROR(LINE getLine() ): a cannot be matchedendl; ofsERROR(LINE getLine(): a cannot be matchedendl; else coutERROR(LINE getLine()

16、: Unexpected endingendl; ofsERROR(LINE getLine() ): Unexpected endingendl;coutThis is invalid!endlendl;ofsThis is invalid!endli=e etc tfdf-n d-! cac a+tERROR(LINE 1 ): Unexpected ending This is invalid!v=*mANALYSIS:x-i=eERROR(LINE 2 ) : * cannot be matched This is invalid!ANALYSIS: x-i=e e-tc tfd f-

17、i d-! c_ac a-t tfd f-n d一!二out-记事本J 文件(B 编卓旧格式(Q)查看(Y) 帮助(H)d-! c-!This is valid!q二m+4/x ANALYSIS: xi=e e_tc t-fd f-i d-! c-ac a-+t tfd f-n dbd b/f f-i d-! c-!This is valid!x=x*(7+5) ANALYSIS: x-i=e e_tc tfd f-i dbd b*f f(e) etc |out-记事本文件(E)编辑旧格式(Q) (V) 帮助etctfdf-nd-!c_aca-+tt-fdf-nd-!c-!d-!c-!This

18、 is valid!x= (5+(4*m/7-3)*t ANALYSIS: xi=e etc tfd f-(e) etc tfd f-n d-!c_ac a+t t-fd f-(e) etc t-fd f-:n dbdI out-记事本文件(B (E)格式。(v)帮助fd catfetf&bfdbfd c & cd c&bf & cctdecd df df c t d d f n 1- a + f(tf nb*ib/n! a - f n ! ! ! ! b * i ! ! s iis valid!实验总结:原本以为处理四则运算赋值将会很困难,但在使用LL (1)后发现,思路还是挺清晰 简单的,但在实验过程中,由于LL(1)不能出现左递归

温馨提示

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

评论

0/150

提交评论