递归下降语法分析过程中进行翻译题目:文法GE →TMM →+TM | εT →FNN →*FN | εF →(E) | num参考第四章递归下降预测分析法示例代码,完成在递归下降语法分析过程中进行语义分析。要求:(1)屏幕输入算数表达式;(2)如果算数表达式语法正确,输出算数表达式值;如果算数表达式语法错误,输出错误提示信息。
时间: 2024-02-13 16:01:43 浏览: 21
好的,我知道你的问题了。针对你的问题,我可以提供以下的解答:
首先,我们需要定义一些语法规则和语义动作。具体来说,我们需要定义以下规则和动作:
规则:
GE → TMM | ε
T → FNN | ε
F → (E) | num
动作:
1. T -> F {T.val = F.val}
2. N -> * F {N.val = N.val * F.val}
3. M -> + T {M.val = M.val + T.val}
4. E -> (T) {E.val = T.val}
5. E -> num {E.val = num.val}
其中,T.val 表示 T 的语义值,N.val 表示乘法操作的语义值,M.val 表示加法操作的语义值,E.val 表示表达式的语义值。
接下来,我们可以编写递归下降语法分析程序。具体来说,我们可以使用 Python 编写以下程序:
```python
# 定义全局变量
pos = 0
exp = ""
# 读取下一个字符
def next_char():
global pos
if pos < len(exp):
pos += 1
# 获取下一个 token
def get_token():
global pos
global exp
while pos < len(exp) and exp[pos] == " ":
pos += 1
if pos < len(exp):
if exp[pos].isdigit():
start = pos
while pos < len(exp) and exp[pos].isdigit():
pos += 1
return exp[start:pos]
else:
pos += 1
return exp[pos-1]
else:
return ""
# 报错函数
def error(msg):
print("Error: " + msg)
# 语法分析函数
def parse_ge():
global pos
global exp
t_val = parse_t()
m_val = parse_mm()
if m_val is None:
return t_val
else:
return m_val
def parse_t():
global pos
global exp
f_val = parse_f()
n_val = parse_nn()
if n_val is None:
return f_val
else:
return n_val
def parse_f():
global pos
global exp
token = get_token()
if token == "(":
e_val = parse_ge()
if get_token() != ")":
error("Expecting )")
return e_val
elif token.isdigit():
return int(token)
else:
error("Expecting num or (")
return None
def parse_nn():
global pos
global exp
token = get_token()
if token == "*":
f_val = parse_f()
if f_val is None:
return None
n_val = parse_nn()
if n_val is None:
return f_val
else:
return {"type": "*", "left": n_val, "right": f_val}
else:
return None
def parse_mm():
global pos
global exp
token = get_token()
if token == "+":
t_val = parse_t()
if t_val is None:
return None
m_val = parse_mm()
if m_val is None:
return t_val
else:
return {"type": "+", "left": m_val, "right": t_val}
else:
return None
# 语义分析函数
def evaluate(node):
if isinstance(node, int):
return node
elif node["type"] == "+":
return evaluate(node["left"]) + evaluate(node["right"])
elif node["type"] == "*":
return evaluate(node["left"]) * evaluate(node["right"])
# 主函数
def main():
global exp
exp = input("请输入算数表达式:")
res = parse_ge()
if res is None:
error("Syntax error")
else:
print("结果为:", evaluate(res))
# 运行主函数
main()
```
在程序中,我们首先定义了一个全局变量 pos 表示当前读取到的字符位置,以及一个全局变量 exp 表示要分析的算数表达式。然后,我们定义了一些辅助函数,包括 next_char、get_token 和 error。其中,next_char 函数用于读取下一个字符,get_token 函数用于获取下一个 token,error 函数用于报错。接下来,我们定义了 parse_ge、parse_t 和 parse_f 等语法分析函数,分别用于分析 GE、T 和 F 非终结符号。其中,parse_nn 和 parse_mm 函数用于分析乘法和加法操作。最后,我们定义了 evaluate 函数用于进行语义分析,主函数中调用 parse_ge 函数进行语法分析,并调用 evaluate 函数进行语义分析。如果语法正确,程序将输出算数表达式的值,否则输出错误提示信息。
希望我的回答能够帮到你!