编译原理实验二:赋值语句的语法分析程序设计
1.1实验内容
目的:
- 在前面实验的基础上,通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。
要求:
- 设计出给定源语言中包含有算术表达式、关系表达式和逻辑表达式的赋值语句的文法,文法满足采用的语法分析方法的要求。
- 选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。
- 选择对各种常见程序语言都通用的语法结构,以文本文件形式输入源程序,把其中赋值语句作为分析对象进行语法检查,输出分析结果。
1.2实验分析
在本次的实验中呢,我采用的方法是递归下降法*(别问,问就是相对简单)*其实也还好,看各自感觉吧,然后我使用的语法是PL/0相关赋值语句的语法,如下:
〈赋值语句〉∷=〈标志符〉:=〈表达式〉
〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}
〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}
〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’
特别巧的是,由于本人的学术不精,刚开始并不知道递归下降法还需要求出相应的字符的select集,而且我使用的语法刚好是不需要往后看一个字符就可以完成的,所以,在验收的时候我才被老师说明白需要求出每个产生式的select,如果有需要参考我的代码的童鞋们可以自己加一下相关的部分哦,不是特别难。
递归下降法在我看来相对于其他几种方法都比较简单,是对每一个产生式进行分析,不同产生式对应的函数之间进行调用等,便可完成相应的功能。
1.3实验代码
赋值语句相应产生式的分析:
void assignment() {
if (s == "ident") {
flag = move();
if (flag == 0) {
cout << "语法错误 标识符后面缺项" << endl;
success = 0;
return;
}
if (s == "becomes") {
flag = move();
if (flag == 0) {
cout << "语法错误 赋值符后面缺项" << endl;
success = 0;