Имея проблему с PLY, я попытался перефразировать тот же фрагмент грамматики в зубре и столкнулся с аналогичной проблемой.Это говорит о том, что я могу делать что-то не так.
Символическое представление фрагмента грамматики выглядит следующим образом:
document -> fragment?
fragment -> { \n line* \n fragment? }
line -> [^\n]+ \n
Соответствующие строки lex:
[{}] return *yytext;
[^\n]+ return ANYTHING;
\n return EOL;
соответствующие линии бизонов:
multiline: '{' EOL lines EOL multiline '}'
|
;
lines: lines ANYTHING EOL
|
;
Грамматика является детерминированной, поскольку все, что я знаю, должно быть даже LALR (1) (хотя на самом деле я не пытался построить таблицу).Документ, подобный "{\n\n}"
, анализирует ОК, но документ, в котором элементы multiline
вложены (например, "{\n\n{\n\n}}"
), нет, лексер видит последний "}}"
как токен "ANYTHING"
, а не два '}'
s..
Что я делаю не так?