在p_error()中调试ply以访问解析器状态/堆栈

时间:2014-11-17 18:49:02

标签: python parsing ply

有没有办法在p_error()中访问解析器状态/堆栈?

我所知道的是,我可以查看有问题的令牌。

2 个答案:

答案 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中的parseyacc.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()必须在此解决方案的工作范围内。