Python 如何使用ply建立if条件?

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表达式 |表达式或相等表达式 |表达式相等表达式 |表达

我正在尝试使用ply构建一个简单的编译器。我正确地构建了算术和逻辑表达式,但在运行if条件时出现了一些错误。例如,当我输入if(5>2)作为程序的输入时,我得到了
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