- 实验目的与要求
通过本次实验,加深对自底向上的语法分析的理解
- 实验内容与方法
任务:计算文法中所有变量的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.代码运行截图: