PLY lex yacc: обработка ошибок
Я использую PLY для разбора файла. Я должен напечатать сообщение пользователю, когда у меня есть ошибка в строке.
Сообщение как Error at the line 4
,
def p_error(p):
flag_for_error = 1
print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
yacc.errok()
Но это не работает. У меня ошибка
print ("Erreur de syntaxe sur la ligne %d" % (p.lineno))
AttributeError: 'NoneType' object has no attribute 'lineno'
Есть ли другой, более подходящий способ сделать это?
2 ответа
Я столкнулся с той же проблемой некоторое время назад. Это вызвано неожиданным окончанием ввода.
Просто проверить, если p
(который на самом деле является маркером в p_error
) является None
,
Ваш код будет выглядеть примерно так:
def p_error(token):
if token is not None:
print ("Line %s, illegal token %s" % (token.lineno, token.value))
else:
pirnt('Unexpected end of input');
Надеюсь это поможет.
Я решил проблему. Моя проблема была в том, что я всегда инициализирую парсер заново.
def p_error(p):
global flag_for_error
flag_for_error = 1
if p is not None:
errors_list.append("Erreur de syntaxe à la ligne %s"%(p.lineno))
yacc.errok()
else:
print("Unexpected end of input")
yacc.errok()
Хорошая функция
def p_error(p):
global flag_for_error
flag_for_error = 1
if p is not None:
errors_list.append("Erreur de syntaxe à la ligne %s"%(p.lineno))
yacc.errok()
else:
print("Unexpected end of input")
Когда у меня ожидаемый конец ввода, я не должен продолжать синтаксический анализ.
Спасибо