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'

Есть ли другой, более подходящий способ сделать это?


person dimele    schedule 08.07.2014    source источник


Ответы (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:
        print('Unexpected end of input')

Надеюсь это поможет.

person Sumukh Barve    schedule 19.07.2014
comment
Я сделал так несколько дней назад, но это не работает. Синтаксический анализатор выполняет оператор else бесконечно. - person dimele; 22.07.2014

Я решил проблему. Моя проблема заключалась в том, что я всегда повторно инициализирую парсер.

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

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

Спасибо

person dimele    schedule 22.07.2014