有没有办法在p_error()中访问解析器状态/堆栈?
我所知道的是,我可以查看有问题的令牌。
答案 0 :(得分:1)
调用它时,您可以将debug=1
传递给parse
,它将输出解析器堆栈。
为方便起见,以下是函数定义:
def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
如果在调用yacc
时进行设置,也可以将调试输出发送到文件。为方便起见,这是函数定义:
def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='', debuglog=None, errorlog = None, picklefile=None):
您可能会发现检查yacc
中的parse
和yacc.py
方法有用,看看它是如何运作的。
答案 1 :(得分:1)
如果您只对p_error被触发时的堆栈状态感兴趣,但不希望记录所有其他调试信息,那么这样做很好:
def p_error(p):
# get formatted representation of stack
stack_state_str = ' '.join([symbol.type for symbol in parser.symstack][1:])
print('Syntax error in input! Parser State:{} {} . {}'
.format(parser.state,
stack_state_str,
p))
您使用parser
创建的parser = yacc.yacc()
必须在此解决方案的工作范围内。