2014-11-17 3 views

ответ

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

Если вы заинтересованы только в состоянии стека в точке, где 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(), чтобы это решение работало.

Смежные вопросы