PLY lex yacc:错误处理

时间:2014-07-08 09:10:41

标签: python yacc lex ply

我正在使用PLY来解析文件。当我在一行上出错时,我必须向用户打印一条消息。

Error at the line 4等消息。

def p_error(p):
    flag_for_error = 1
    print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
    yacc.errok()

但它不起作用。我有错误

print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
AttributeError: 'NoneType' object has no attribute 'lineno'

还有另一种更合适的方法吗?

2 个答案:

答案 0 :(得分:3)

前一段时间我遇到了同样的问题。它是由意外的输入结束引起的。

只测试pp_error中实际上是一个令牌)是None

您的代码看起来像这样:

def p_error(token):
    if token is not None:
        print ("Line %s, illegal token %s" % (token.lineno, token.value))
    else:
        print('Unexpected end of input')

希望这有帮助。

答案 1 :(得分:1)

我解决了这个问题。 我的问题是我总是重新初始化解析器。

def p_error(p):
    global flag_for_error
    flag_for_error = 1

    if p is not None:
        errors_list.append("Erreur de syntaxe à la ligne %s"%(p.lineno))
        yacc.errok()
    else:
        print("Unexpected end of input")
        yacc.errok()

好的功能是

def p_error(p):
    global flag_for_error
    flag_for_error = 1

    if p is not None:
        errors_list.append("Erreur de syntaxe à la ligne %s"%(p.lineno))
        yacc.errok()
    else:
        print("Unexpected end of input")

当我有预期的输入结束时,我不能继续解析。

谢谢