编译原理 实验四 自底向上的语法分析程序

  • 实验目的与要求

通过本次实验,加深对自底向上的语法分析的理解

  • 实验内容与方法

任务:计算文法中所有变量的FIRSTOP 集

在基于算符优先分析法的自底向上语法分析中,算符的优先关系矩阵构造是实现成功语法分析的关键,而FIRSTOP 集(LASTOP 集)的构造又是构造算符间优先关系的关键。因此,能否正确理解并构造变量的FIRSTOP 集(LASTOP集)在自底向上的语法分析中具有重要的意义。

在本实验中,请根据课本P159中给出的FIRSTOP 构造算法的伪代码编写程序,实现对输入文法中所有变量FIRSTOP 集的求解。

-----------------------------------------------------------------------------------

例如对下列文法:

G:E→E+T| E-T|T

   T→T*F| T/F|F

   F→(E)|i

对于变量E、T、F,FIRSTOP 的求解结果应为:

FIRSTOP(E)={+,-,*,/,(, i}

FIRSTOP(T)={*,/,(, i)

FIRSTOP(F)={(, i)

-----------------------------------------------------------------------------------

注意:实验一“高级语言及其文法”中已经实现了从文本文件中读取文法,

因此该实验中请将自行定义的测试文法保存至grammer.txt 中,读取后完成对该文法中所有变量的FIRSTOP 集求解。Txt文档格式可以自行优化

2. 实验要求

● 使用C/C++完成编程;

● 构造测试文法,完成对程序正确性的验证;

● 使用实验所提供的模板撰写实验报告,不要增删,要求内容详实,包含课本上的理论描述,针对本实验的具体设计、思路描述,关键代码片段及其注释,及实验输入输出屏幕截图;

● 在截止日期前将代码、实验报告、测试文件

3.实验步骤与过程

1.首先,读取一个文法文件,并将文法存储在unordered_map<char, vector<vector<char>>>类型的grammar中。其中,键为非终结符,值为对应的产生式序列。

 

2. 定义readGrammarFromFile函数读取文法。

 

 

3. 接下来,定义一个函数computeFirstOp,用于计算每个变量的FIRSTOP集合。函数使用unordered_map<char, unordered_set<char>>类型的firstop来存储每个变量的FIRSTOP集合。

首先,将每个变量的FIRSTOP集合初始化为空集。

 

然后,使用循环进行迭代,直到不再发生变化为止。在每次迭代中,遍历文法的每个产生式,并根据产生式的符号类型进行不同的操作:

如果符号是非终结符,分为两种情况:

非终结符不等于变量:将非终结符的FIRSTOP集合添加到变量的FIRSTOP集合中。

 

 

非终结符等于变量:从产生式的第二个符号开始,依次处理每个符号。如果是非终结符,将其FIRSTOP集合(除去空符号'#')添加到变量的FIRSTOP集合中;如果是终结符,将其添加到变量的FIRSTOP集合中,并结束处理。

 

如果符号是终结符,直接将其添加到变量的FIRSTOP集合中。

 

在每次迭代中,如果变量的FIRSTOP集合发生变化,将changed标志设置为true,表示需要进行下一次迭代。

4.在main函数中,指定文法文件的路径,并调用readGrammarFromFile函数读取文法。然后,调用computeFirstOp函数计算每个变量的FIRSTOP集合,并将结果存储在firstop变量中。最后,输出每个变量的FIRSTOP集合。

 

 5.代码运行截图:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值