E→T|E+T|E-T T→F|T*F|T/F F→i|(E) 消去上面文法的左递归
时间: 2023-08-08 22:08:14 浏览: 203
好的,针对这个文法,我们可以进行如下的左递归消除:
首先,将文法中的T替换为一个新的非终结符号X:
```
E → TX
X → +TX | -TX | ε
T → FY
Y → *FY | /FY | ε
F → i | (E)
```
接下来,我们需要消除E中的左递归。
```
E → TX
X → +TX | -TX | ε
T → FY
Y → *FY | /FY | ε
F → i | (E)
```
因此,消除左递归后的文法为:
```
E → TX
X → +TXX | -TX | ε
T → FY
Y → *FY | /FYY | ε
F → i | (E)
```
希望这个回答能够解决您的问题。
相关问题
E→T|E+T|E-T T→F|T*F|T/F F→i|(E) 消去上面文法的左递归,并说明为什么这样消去
该节点的 f(n),如果不存在,则将其加入开放列表。
在 A* 算法中,我们需要计算启发函数 h(n) 和估价函数 f(n)。启发函数 h(n) 是对当前节点到目标节点的距消除左递归后的新文法为:
E → TE'
E' → +TE' | -TE' | ε
T → FT'
T' → *FT' | /FT' | ε
F → i | (E)
在原始文法离的估计,而估价函数 f(n) 则是当前节点到目标节点的实际距离的估计,中,E与T存在左递归,导致无法使用LL(1)文法进行分析,因此需要消即 f(n) = g(n) + h(n)。在本题中,我们可以使用三种不同的启发函数除左递归。消除左递归后,新文法不仅可以使用LL(1)文法进行分析,来计算 h(n),分别是:
1. 启发函数 h(n) = w(n),即将当前状态与目标还便于使用递归子程序进行语法分析。
E→T|E+T|E-T T→F|T*F|T/F F→i|(E) 消去上面文法的左递归 , 按消去左递归的文法,写出对应的递归下降语法分析器。
消除左递归后的文法如下:
E → TE'
E' → +TE' | -TE' | ε
T → FT'
T' → *FT' | /FT' | ε
F → i | (E)
对应的递归下降语法分析器如下:
```python
def parse_E():
parse_T()
parse_E_prime()
def parse_E_prime():
if lookahead == "+":
match("+")
parse_T()
parse_E_prime()
elif lookahead == "-":
match("-")
parse_T()
parse_E_prime()
else:
# E' → ε
pass
def parse_T():
parse_F()
parse_T_prime()
def parse_T_prime():
if lookahead == "*":
match("*")
parse_F()
parse_T_prime()
elif lookahead == "/":
match("/")
parse_F()
parse_T_prime()
else:
# T' → ε
pass
def parse_F():
if lookahead == "i":
match("i")
elif lookahead == "(":
match("(")
parse_E()
match(")")
else:
raise SyntaxError("Invalid input")
def match(token):
global lookahead
if lookahead == token:
lookahead = next_token()
else:
raise SyntaxError("Invalid input")
def next_token():
global token_index
if token_index < len(tokens):
token_index += 1
return tokens[token_index - 1]
else:
return None
# 初始化
tokens = ["i", "+", "i", "*", "(", "i", "/", "i", ")", "$"]
lookahead = tokens[0]
token_index = 0
# 开始解析
parse_E()
if lookahead == "$":
print("Parsing succeeded")
else:
print("Parsing failed")
```
其中,`tokens` 是输入的 token 序列,`lookahead` 表示当前读入的 token,`token_index` 表示当前读到了第几个 token。`parse_E`、`parse_E_prime`、`parse_T`、`parse_T_prime` 和 `parse_F` 分别对应文法中的非终结符号,`match` 用于匹配当前读入的 token,`next_token` 返回下一个 token。最后判断是否解析成功,如果成功则输出 `Parsing succeeded`,否则输出 `Parsing failed`。
阅读全文