【问题标题】:How to build if condition using ply?如何使用 ply 建立 if 条件?
【发布时间】: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


【解决方案1】:

在 Ply 中,词法分析器函数必须始终返回一个标记对象。

但是在这里,你返回一个字符串:

def t_IF(t):
    r'if'
    return t.value

应该是:

def t_IF(t):
    r'if'
    return t

虽然您最好按照第 4.3 节末尾的 Ply manual 中的建议处理关键字。

【讨论】:

  • 更改后出现另一个错误:AttributeError: 'NoneType' object has no attribute 'value' 感谢您的回复。
  • @sahar:我认为这将是其他令牌操作出错的结果。
  • 我已经解决了这个问题。非常感谢你的帮助。我真的很感激。
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2020-10-06
  • 2015-08-26
相关资源
最近更新 更多