编译原理 实验三 LR(1)分析法 Java版

编译原理 实验三 LR(1)分析法 Java版

一、 实验目的

构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

二、 描述 LR(1)语法分析程序的设计思想

**1.**提取所有有效识别活前缀的式子:

形式上我们说一个LR(1)项目[A→a·b, a]对于活前缀g是有效的,如果存在规范推导 其中,

  1. g=da;

  2. a是w的 第一个符号,或者a为#而w为e。

[A→a·Bb, a]对活前缀g=da是有效的,则对于每个形如B®x的产生式, 对任何bÎFIRST(ba),[B→·x, b]对g也是有效的。

**2.**项目集I 的闭包CLOSURE(I)构造:

  1. I的任何项目都属于CLOSURE(I)。

  2. 若项目[A→a·Bb, a]属于CLOSURE(I),B→x 是一个产生式,那么,对于FIRST(ba) 中的每个终结符b,如果[B→·x, b]原来不在CLOSURE(I)中,则把它加进去。

  3. 重复执行步骤2,直至CLOSURE(I)不再增大为止。

3.GO****构造:

令I是一个项目集,X是一个文法符号,函数GO(I,X)定义为:GO(I,X)=CLOSURE(J)其中J={任何形如[A→aX·b, a]的项目| [A→a·Xb, a]ÎI}

**4.**分析表构造:

令每个Ik的下标k为分析表的状态,令含有[S¢→·S, #]的Ik的k为分析器的初态。

  1. 若项目[A→a·ab, b]属于Ik且GO(Ik, a)=Ij, a为终结符,则置ACTION[k, a]为 “sj”。

  2. 若项目[A→a·,a]属于Ik,则置ACTION[k, a]为 “rj”;其中假定A→a为文法G¢的第j个产生式。

  3. 若项目[S¢→S·, #]属于Ik,则置ACTION[k, #]为 “acc”。

  4. 若GO(Ik,A)=Ij,则置GOTO[k, A]=j。

  5. 分析表中凡不能用规则1至4填入信息的空白栏均填上“出错标志”。

三、 程序结构描述:

函数名称及调用格式返回类型参数含义返回值描述函数功能
void init() 得到相应的终结符集和非终结符集
String getAction(int topState, char in) 返回action表中相应的字符串Topstate是状态栈中的栈顶符号,in是当前输入符号通过栈顶状态和输入符号来查找相应的action表,得到表中对应操作
String getStateStack()状态栈里全部符号得到当前状态栈中的全部符号
String getCharStack()符号栈的全部符号得到符号栈的全部符号
int getGoto(int state, char c)Goto表中对应状态得到goto表中对应的状态
void analyze()根据action表和goto表的内容进行LR(1)分析
MyFrame(String title) 标题字符这是构造器,为了将输出界面化
void actionPerformed(ActionEvent actionEvent)响应事件主要为按钮绑定事件,进行语法分析
void main(String[] args)Main参数Main方法,执行入口

注:分析表构造的逐步分析过程由OnBnClickedButton1()完成在表格控件输出。

四、 详细的算法描述

在这里插入图片描述

(1)移进:

​ table[i,a]= Sj:状态 j 移入到状态栈,把a移入到文法符号栈,其中 i,j 表示状态号。

(2)归约:

​ table[i,a]=rk:当在栈顶形成句柄时,则归约为相应的非终结符 A,即文法中有 A- B 的产生式,若 B 的长度为 R(即|B|=R),则从状态栈和文法符号栈中自顶向下去掉 R 个符号,即栈指针 SP 减去 R,并把 A 移入文法符号栈内,j=GOTO[i,A]移进状态栈,其中 i 为修改指针后的栈顶状态。

(3)接受 acc:

​ 当归约到文法符号栈中只剩文法的开始符号 S 时,并且输入符号串已结束即当前输入符是’#',则为分析成功,当table中该项为acc时分析成功接受。

(4)报错:

当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输

入端不是该文法能接受的符号串。

五、 结果和代码

在这里插入图片描述
有用的话,请不要吝啬,动动小手点个赞把~

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
语法分析器是编译器的核心组件之一,它的主要任务是将输入的源代码转换成抽象语法树,以便于后续的语义分析和代码生成。为了构造一个语法分析器,需要完成以下预习任务: 1. 学习上下文无关文法(CFG) 上下文无关文法是描述编程语言语法的一种形式化语言。了解上下文无关文法的概念和性质,以及如何使用上下文无关文法来描述编程语言的语法,是构造语法分析器的基础。 2. 熟悉自顶向下语法分析算法 自顶向下语法分析算法是一种从语法的起始符号开始,逐步推导出输入符号串的过程。常见的自顶向下语法分析算法有LL算法和递归下降算法。了解这些算法的原理和实现方式,可以帮助构造语法分析器。 3. 了解预测分析表 预测分析表是一种用于自顶向下语法分析的数据结构,它将文法的非终结符和终结符组合在一起,形成一个表格。了解预测分析表的构造方法和使用方式,可以帮助构造语法分析器。 4. 掌握ANTLR工具 ANTLR是一种用于构造语法分析器的工具,它可以根据输入的语法规则自动生成语法分析器。掌握ANTLR工具的使用方法,可以大大提高语法分析器的开发效率。 5. 理解语法错误处理 在构造语法分析器时,需要考虑如何处理语法错误。了解语法错误的种类和如何进行错误处理,可以帮助构造健壮的语法分析器。 总之,构造语法分析器需要深入了解上下文无关文法、自顶向下语法分析算法、预测分析表、ANTLR工具和语法错误处理等知识,并且需要具备一定的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦中情几许

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值