编译原理语法分析实验报告.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理语法分析实验报告概要

院 系: 专 业: 年 级: 课 程 名 称: 编译原理 组 号: 姓名(学号): 指 导 教 师: 2016年 6 月 16 日 年级 班号 组号 专业 计算机科学与技术 实验名称 语法分析 实验室 实 验 目 的 和 要 求 一、实验目的: 根据算术表达式文法编制调试语法分析程序,以便对输入的符号串进行分析, 二、实验要求: 任给一个表达式(含括号嵌套),判断是否合法,如果非法,给出提示(含出错位置)。 算法表达式文法如下: E - E+T | E-T | T T - T*F | T/F | F F - (E) | I 3. 实现方法: 可以采用LL(1)分析、递归下降分析、优先分析、LR(1)分析这四种分析方法中的任意一种方法。如果用LL(1)分析,则首先需要消除左递归(改写文法),然后自行构造LL(1)分析表;如果用递归下降分析,也首先需要消除左递归;优先分析和LR(1)分析则无需消除左递归。 4. 语言环境要求: 可以用任何一种可视化编程的平台开发,基于WEB的也可,要求有界面。 三、算法思想 1 .分析 a)?E=E+T=E+T*F=E+T*(E)即有E=E+T*(E)存在左递归。用直接改写法消除左递归,得到如下: E? -?TE’ E’??-?+TE’ | ?TE’|ε 概 要 设 计 ( 整 体 流 程 ) T???-?FT’ T’??-?*FT’ | /FT’|ε F??-?(E) | i b)?对于以上改进的方法。可得: 对于E’:??FIRST( E’ )=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,?,ε}? 对于T’:??FIRST( T’ )=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε}? 而且: FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i } 由此我们容易得出各非终结符的FOLLOW集合如下: FOLLOW( E )= { ),#} FOLLOW(E’)= FOLLOW(E)={ ),#} FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,?,),#} FOLLOW( T’ ) = FOLLOW( T ) ={+,?,),#} FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,?,),#} 由以上FOLLOW集可以我们可以得出SELECT集如下: 对E????????SELECT(E-TE’)=FIRST(TE’)=FIRST(T)={ (,i } 对E’???????SELECT(E’?-+TE’)={ + }? ????? ?SELECT(E’-??TE’)={ ? } ?????? SELECT(E’?-ε)={ε,),#} 对T????????SELECT(T-FT’)={(,i} 对T’?? ????SELECT(T’?-*FT’)={ * }?? SELECT(T’?-?∕FT’)={ ∕ } SELECT(T’?-ε)={ε,+,?,),#} 对F????????SELECT(F-(E)?)={ ( } SELECT(F-i)={ i } ∴???SELECT(E’?-+TE’)∩SELECT(E’?-??TE’)∩SELECT(E’?-ε)=F SELECT(T’?à*FT’)∩SELECT(T’?à?∕FT’)∩SELECT(T’?àε)=F SELECT(Fà(E)?)∩SELECT(Fài)=?F 由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。因此,转化后的文法可以用递归下降分析法作语法分析。? ? ? 概 要 设 计 ( 整 体 流 程 ) 流程图: ? ? ? 详 细 设 计 ( 算 法 实 现 ) 四、详细设计1.public boolean isContainsIllegalSymbol(String s) 判断输入字符是否是合法字符,正确返回true,错误返回false for (int i = 0; i s.length(); i++) { char ch=s.charAt(i); if(!(ch==i||ch==(||ch==)||ch==+||ch==-||ch==*||ch

文档评论(0)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档