【发布时间】:2020-04-04 16:05:07
【问题描述】:
我正在尝试使用 ply 构建一个简单的编译器。我正确地构建了算术和逻辑表达式,但是在运行 if 条件时出现了一些错误。例如,当我输入 if(5>2) 作为程序的输入时,我得到了AttributeError: 'str' object has no attribute 'type'
我的代码示例:
def t_IF(t):
r'if'
return t.value
def p_statement_expr(t):
'''statement : expression
| comparison
| if_statement'''
print(t[1])
def p_IF(t):
'''if_statement : IF LPARENTHESES comparison RPARENTHESES'''
t[0] = t[3]
def p_expression_comparison(t):
'''comparison : expression GTH expression
| expression LTH expression
| expression GTHOREQUAL expression
| expression LTHOREQUAL expression
| expression EQUALEQUAL expression
| expression NOTEQUAL expression'''
if t[2] == '>':
if t[1] > t[3]:
t[0] = True
else:
t[0] = False
elif t[2] == '<':
if t[1] < t[3]:
t[0] = True
else:
t[0] = False
elif t[2] == '>=':
if t[1] >= t[3]:
t[0] = True
else:
t[0] = False
elif t[2] == '<=':
if t[1] <= t[3]:
t[0] = True
else:
t[0] = False
elif t[2] == '==':
if t[1] == t[3]:
t[0] = True
else:
t[0] = False
elif t[2] == '!=':
if t[1] != t[3]:
t[0] = True
else:
t[0] = False
任何帮助都会很有价值。谢谢。
【问题讨论】:
-
在 Ply 中,我们通常使用
p作为解析器操作函数 (p_…) 的参数名称。p是一个语法值列表(或一个像列表一样的对象)。我们使用t作为词法分析器函数的参数名称(t_…)。t是一个令牌对象。使用不同的名称有助于我们记住类型是不同的。 -
是的,我会解决这个问题,谢谢。
标签: python parsing compiler-errors lexer ply