编译原理实验之语法分析

这篇博客详细介绍了如何进行编译原理的语法分析实验,重点是使用Java语言实现LL(1)方法。实验包括求First和Follow集合,构造预测分析表,以及通过测试用例验证分析程序。在分析过程中,博主发现了文法的缺陷,并提出了通过添加stmt -> ε的产生式来解决测试用例2中出现的错误。完整代码也在文中给出。
摘要由CSDN通过智能技术生成

一、实验目的

编写一个语法分析程序,实现对词法分析提供的单词序列的检查和结果分析。

二、实验要求

用高级语言编写程序,实现对简单语言的语法分析

(1)待分析语言的文法

在这里插入图片描述

(2)实验要求说明

输入简单语言,并以 “#” 结尾,输出栈里的内容及其相应的行为,如果成功,打印success,否则打印error。

三、实验过程

本次实验采用的是LL(1)方法,使用的是Java语言编写

1. 求First和Follow

在这里插入图片描述

2. 构造预测分析表

(1) 对文法生成式编号

  1. program -> begin stmts end
  2. stmts -> stmt stmtsas
  3. stmtsas -> ; stmt stmtsas
  4. stmtsas -> ε
  5. stmt -> ID := exp
  6. exp -> item items
  7. items -> + item items
  8. items -> - item items
  9. items -> ε
  10. item -> factor factors
  11. factors -> * factor factors
  12. factors -> / factor factors
  13. factors -> ε
  14. factor -> ID
  15. factor -> NUM
  16. factor -> (exp)

(2)预测分析表

在这里插入图片描述

(3)测试用例

测试用例1(正确用例):

begin
	x := (3 +5) / 2;
	y :=(4 - 1 * x) * 2;
	y := x
end #

对应输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出的success表示测试通过.

测试用例2(错误用例):

begin
	x := (3 +5) / 2;
	y :=(4 - 1 * x) * 2;
	y := x;
end #

对应输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出的error表示测试失败.

3. 分析

(1) 试比较测试用例1和测试用例2,会发现测试用例2只在 “end #” 前面多加了个 “;”, 从测试用例的结果(第三张图75行处)来看,出错在栈顶元素为stmt,输入的首单词为end处,查看预测分析表,发现在表中stmt行、end列并没有相应的产生式,故出错。但是正常情况下每行语句后都应有";"表示结束,故我们可以在分析表中的此处加入产生式stmt -> ε,即可解决此问题。

(2) 这个问题是所给文法存在缺陷而造成的,故读者可以根据实际情况来修改,加入的产生式体现在代码71行处,供读者参考。

四、完整代码

主体部分:

package grammar;

import java.io.IOException;
import java.util.Stack;

public class Grammar 
{
   
	//预测分析表
	private String[][] LL1_table = new String[9][12];
	//非终结符
	private String[] vn = {
   "program", "stmts", "stmtsas", "stmt", "exp", "items", "item", "factors", "factor"};
	//终结符
	private String[] vt = {
   "begin", "end", "ID", "NUM", ";", ":=", "+", "-", "*", "/", "(", ")"};
	//定义栈
	private Stack<String> a = new Stack<>();
	//将栈里的内容拼接成字符串输出
	private StringBuilder sstack = new StringBuilder();
	//将输入串的前6位(不包括已匹配的单词)拼接成字符串显示
	private StringBuilder sin = new StringBuilder()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值