Python 如何使用ply建立if条件?
我正在尝试使用ply构建一个简单的编译器。我正确地构建了算术和逻辑表达式,但在运行if条件时出现了一些错误。例如,当我输入if(5>2)作为程序的输入时,我得到了Python 如何使用ply建立if条件?,python,parsing,compiler-errors,lexer,ply,Python,Parsing,Compiler Errors,Lexer,Ply,我正在尝试使用ply构建一个简单的编译器。我正确地构建了算术和逻辑表达式,但在运行if条件时出现了一些错误。例如,当我输入if(5>2)作为程序的输入时,我得到了AttributeError:'str'对象没有属性'type' 我的代码示例: def t_IF(t): r'if' return t.value def p_表达式_比较(t): ''比较:表达式GTH表达式 |表达式LTH表达式 |表达式GTHOREQUAL表达式 |表达式或相等表达式 |表达式相等表达式 |表达
AttributeError:'str'对象没有属性'type'
我的代码示例:
def t_IF(t):
r'if'
return t.value
def p_表达式_比较(t):
''比较:表达式GTH表达式
|表达式LTH表达式
|表达式GTHOREQUAL表达式
|表达式或相等表达式
|表达式相等表达式
|表达式NOTEQUAL表达式“”'
如果t[2]=='>':
如果t[1]>t[3]:
t[0]=True
其他:
t[0]=False
elif t[2]='='=':
如果t[1]>=t[3]:
t[0]=True
其他:
t[0]=False
elif t[2]=='在Ply中,lexer函数必须始终返回令牌对象
但在这里,您将返回一个字符串:
def t_IF(t):
r'if'
return t.value
应该是:
def t_IF(t):
r'if'
return t
尽管您最好按照第4.3节末尾的建议来处理关键字。在Ply中,我们通常使用p
作为解析器操作函数的参数名称(p_…
)p
是语法值列表(或类似于列表的对象)。我们使用t
作为lexer函数的参数名(t…
)t
是一个令牌对象。使用不同的名称有助于我们记住类型是不同的。是的,我会解决此问题,谢谢。更改此名称后会出现另一个错误:AttributeError:“NoneType”对象没有属性“value”。@sahar:我想这将是其他令牌操作出错的结果。我已解决此问题。非常感谢你的帮助。我真的很感激。
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
def t_IF(t):
r'if'
return t.value
def t_IF(t):
r'if'
return t