Бизон, совпадающий с неправильными токенами - PullRequest
0 голосов
/ 08 февраля 2012

Имея проблему с 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..

Что я делаю не так?

1 Ответ

3 голосов
/ 09 февраля 2012
[{}]   return *yytext;
[^{}\n]+ return ANYTHING;
\n     return EOL;

Лекс жадный: если два шаблона соответствуют текущему входу, выигрывает самое длинное совпадение. В исходном фрагменте lex шаблон [^\n]+ ловит строки с { или } в них.

...