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")

Когда у меня ожидаемый конец ввода, я не должен продолжать синтаксический анализ.

Спасибо

Другие вопросы по тегам