Python 如何在PLY yacc中存储错误

Python 如何在PLY yacc中存储错误,python,yacc,ply,Python,Yacc,Ply,我正在使用ply.yacc构建一个解析器,我对将所有语法错误存储在一个列表中很感兴趣。我想要这样的东西: parser=yacc.yacc() parser.errors=[] parser.parse(程序) 打印(parser.errors)#使用parser.errors执行某些操作 问题是,当我定义处理错误的规则时 def p_错误(p): ... 我不知道如何访问解析器实例,因此可以将错误附加到列表中。对于lexer,我使用了ply.lex并解决了这个问题,因为在规则定义中作为参数

我正在使用ply.yacc构建一个解析器,我对将所有语法错误存储在一个列表中很感兴趣。我想要这样的东西:

parser=yacc.yacc()
parser.errors=[]
parser.parse(程序)
打印(parser.errors)#使用parser.errors执行某些操作
问题是,当我定义处理错误的规则时

def p_错误(p):
...
我不知道如何访问解析器实例,因此可以将错误附加到列表中。对于lexer,我使用了ply.lex并解决了这个问题,因为在规则定义中作为参数传递的标记t引用了lexer

def t_错误(t):
t、 lexer.error.append(词典编纂错误(t.lineno,t.value[0]))

是否有任何方法可以使用yacc解析器执行类似操作?

p\u error的参数通常是一个标记(因此原型编写得更好
def p\u error(t):
),因此您可以将错误添加到lexer中使用的相同列表中。但这并不理想;首先,因为这是一个保留错误(词汇和语法)的奇怪地方,第二,因为有时
p_error
的参数是
None
(当错误发生在输入结束时)

更好的解决方案是使解析器成为一个类而不是一个全局类,这在Ply文档中有相当简要的解释(主要是通过参考使lexer成为一个类的部分)。通常,您将在parser类的
\uuuu init\uuu
方法中构建解析器,并将其保存为
self.parser
。然后,所有
p.*
成员函数都采用
self
参数,就像任何类函数一样,并且您可以将错误列表存储为成员属性。(您可以使用
self.parser
访问
解析器
,但我认为在对象实例本身中保留错误列表比将其添加到解析器实例更为清晰。)