2

我正在使用 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'

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

4

2 回答 2

4

不久前我遇到了同样的问题。它是由输入意外结束引起的。

只需测试p(实际上是 中的一个标记p_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')

希望这可以帮助。

于 2014-07-19T07:50:34.393 回答
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")

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

谢谢

于 2014-07-22T06:27:30.893 回答