根据给定文法,先求出 FirstVt 和 LastVt 集合,构造算符优先关系表(要求算符优先 关系表 输出到显示器或者输出到文件); (2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求 输出归约过程) (3)假如给定表达式文法为: G(E’): E’→#E# E→E+T | T T→T*F |F F→(E)|i (4) 分析的句子可为: (i+i)*i 和 i+i)*i
时间: 2024-02-23 22:56:32 浏览: 133
算符优先文法分析算术表达式是否正确
首先,根据文法 G(E'),求出 FirstVt 和 LastVt 集合:
FirstVt(E') = {#, i}
FirstVt(E) = FirstVt(T) = FirstVt(F) = {i}
LastVt(E') = {#, i}
LastVt(E) = LastVt(T) = {+, #}
LastVt(T) = LastVt(F) = {*, +, #}
然后,构造算符优先关系表:
| | # | + | * | ( | ) | i |
| - | - | - | - | - | - | - |
| # | = | < | < | < | = | < |
| + | > | > | < | < | > | < |
| * | > | > | > | < | > | < |
| ( | < | < | < | < | = | < |
| ) | > | > | > | | > | |
| i | > | > | > | | > | |
其中,">" 表示左边的符号优先于右边的符号,"<" 表示右边的符号优先于左边的符号,"=" 表示两边的符号优先级相等。
接下来,分别对给定的两个表达式进行分析。
1. 对于表达式 (i+i)*i:
首先,在表达式的首尾加上 "#",得到 "#(i+i)*i#"
然后,使用算符优先关系表进行分析,得到归约过程如下:
|i + i|* i #|
|T + i|* i #|
|F + i|* i #|
|i|* i #|
|F|* i #|
|T|* i #|
|T * F|# i #|
|E'|# i #|
因此,该表达式是该文法识别的正确的算术表达式。
2. 对于表达式 i+i)*i:
同样地,在表达式的首尾加上 "#",得到 "#i+i)*i#"
使用算符优先关系表进行分析时,发现 ")" 与 "+" 的优先级相等,因此无法判断应该先进行哪个运算。因此,该表达式不是该文法识别的正确的算术表达式。
阅读全文