Есть ли способ получить доступ к состоянию/стеку парсера в p_error()?отладка ply в p_error() для доступа к состоянию/стеку парсера
Все, что я знаю, это то, что я могу посмотреть на оскорбительный токен.
Есть ли способ получить доступ к состоянию/стеку парсера в p_error()?отладка ply в p_error() для доступа к состоянию/стеку парсера
Все, что я знаю, это то, что я могу посмотреть на оскорбительный токен.
Вы можете передать 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
, чтобы увидеть, как это работает.
Если вы заинтересованы только в состоянии стека в точке, где 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()
, чтобы это решение работало.