Ошибка EOF в парсере YACC - PullRequest
       28

Ошибка EOF в парсере YACC

5 голосов
/ 22 ноября 2011

Я пытаюсь проанализировать строку, используя синтаксический анализатор yacc, предоставленный в библиотеке PLY для Python. Сам синтаксический анализатор очень длинный, но проблема, с которой я сталкиваюсь, заключается в том, что он всегда выдает мне одну и ту же ошибку, независимо от того, какую строку я ставлю. Ошибка такая:

yacc: ошибка разбора при вводе. EOF

И лексер работает отлично, так что, я думаю, проблема в парсере. Но я не понимаю эту ошибку, поэтому я даже не знаю, где сначала найти решение этой проблемы

Есть идеи? Большое спасибо!

1 Ответ

6 голосов
/ 28 ноября 2011

Ожидается, что все синтаксические анализаторы, указанные в PLY, будут иметь одно правило верхнего уровня, которое уменьшается в результате анализа всего входного текста.Например, при разборе программы правило верхнего уровня может выглядеть примерно так:

def p_program(p):
    '''
    program : declarations
    '''

def p_declarations(p):
    '''
    declarations : declarations declaration
                 | declaration
    '''
...

Если вы получили ошибку «EOF» в анализаторе, это означает, что она достигла конца ввода безсокращение грамматического правила верхнего уровня.То есть стек разбора не пуст, и больше нет правил, которые можно уменьшить.Поскольку стек не пуст, анализатор попытается сдвинуть больше символов и потерпит неудачу из-за EOF.

Одна из возможных причин этой ошибки - неправильно заданное правило запуска в вашей грамматике.Убедитесь, что первая функция p_rule (p) в файле является правилом запуска.

...