Конечно, бизон мог бы и догадаться, что уравнение
na = na | na nb
na = (|na) nb
na = (nb*) nb
na = nb+
Но наивный парсер здесь получает зацикливание.
Скажем, у нас попытка сопоставить na = "x#"
na = "xxx" ?
nb = "xxx" ?
"a" ... = "xxx" - нет
"c" ... = "xxx" - нет
"d" ... = "xxx" - нет
- нет
na nb = "xxx" ?
nb ... = "xxx" ?
сказка про белого бычка
Здравствуйте, Кодт, Вы писали:
_>>Подскажите как подправить грамматику _>>bison 2.4.1 конфликты: 1 сдвига/вывода
К>Что, если просто задавить эту ошибку?
И что он сделает встретив, например ac#b? Встретив после 'c' знак '#', парсер сделает сдвиг и будет очень удивлен, встретив 'b' вместо 'e'.
Здравствуйте, andrey_egeg, Вы писали:
_>Здравствуйте, Кодт, Вы писали:
К>>Да, а поправить нужно так: _>
_>na : nb
_> | nb na
_> ;
_>
_>Только и всего? Не смешно. :shuffle: _>Мог бы придумать что нить пооригинальней.
Дело не в том, оригинальней или нет, а в том, что это действительно важная замена для таких простых парсеров, как bison. Левосторонняя рекурсия без оснований ему плохо удаётся.
А хорошую подсказку здесь дал Xeor: пример ac#b разбирается двумя возможными путями. Это в общем-то значит, что исходная грамматика некорректна, и пытаться выкрутить это задавливанием конфликтов бессмысленно — в лучшем случае получите reduce/reduce conflict и он откажет собираться. Исправь на корректную.
P.S. А твоя реплика про "Мог бы придумать что нить пооригинальней" слишком многими может быть воспринята как неконструктивный наезд.
Здравствуйте, netch80, Вы писали:
N>А хорошую подсказку здесь дал Xeor: пример ac#b разбирается двумя возможными путями. Это в общем-то значит, что исходная грамматика некорректна, и пытаться выкрутить это задавливанием конфликтов бессмысленно — в лучшем случае получите reduce/reduce conflict и он откажет собираться. Исправь на корректную.
Поскольку контекста из одного символа недостаточно для спуска туда или сюда — это не LL(1)-грамматика (да?)
Если мы сделаем фокус, и склеим токены #b и #e на стадии лексера, то всё будет хорошо.
Может быть, ещё какие-то фокусы возможны — как, например, разруливается if-then/if-then-else.
Может быть, нужно ввести приоритеты...
Идея была в следующем: поскольку неоднозначность возникает между c·#b и c·#e — т.е. непонятно, то ли сворачивать прямо сейчас, то ли чуть погодя...
А не сделать ли нам так, чтобы # всегда сдвигался?!
Тогда момент выбора переместится на один шаг вперёд: c#·b или c#·e# — а уж отличить b от e мы сумеем
Здравствуйте, Xeor, Вы писали:
X>Я вживую его не использовал. Парсер-то и останется LALR(1), только в случае неоднозначности ветвится в оба пути, а потом откидывает неудачный вариант.
А, понятно, это у меня в ходе экспериментов закралась опечатка... сейчас заново набил код — всё заработало.
N>Дело не в том, оригинальней или нет.. N>Исправь на корректную. N>P.S. А твоя реплика про "Мог бы придумать что нить пооригинальней" слишком многими может быть воспринята как неконструктивный наезд.
Смысл упомянутой "реплики про" — это просьба изменить грамматику таким образом, дабы исключить вышеупомянутый конфликт. И, поясни, что "конструктивного" в твоем предложении самому "исправить на корректную", которое с последним — "..наезд." по-сути воспринимается как бестолковый треп.
p.s. решение — пара переставленных строк + оператор %prec и %left(естественно без директивы glr-parser и %expect)
Здравствуйте, andrey_egeg, Вы писали:
_>p.s. решение — пара переставленных строк + оператор %prec и %left(естественно без директивы glr-parser и %expect)
Покажи, пожалуйста, решение.
Перекуём баги на фичи!
Re[6]: bison (конфликт сдвига/вывода)
От:
Аноним
Дата:
25.06.10 13:01
Оценка:
Здравствуйте, Кодт, Вы писали: К>Покажи, пожалуйста, решение.
%right '#'
%start na
%%
nc : 'c' %prec '#'
| 'c' '#' 'e'
| nb
;
na : nc
| na nc
;
nb : 'a' na '#' 'b'
| 'd'
;
%%
Не у кого не завалялись корректные (примерно как Е.Зуева в книге А.Ахо "Компиляторы.." ) bison`и грамматики С++ и HTML? В идеале — интересуют исходники программы SourceMonitor, в которой (по слухам) присутствует первая (C++).
Здравствуйте, Аноним, Вы писали:
А>Не у кого не завалялись корректные (примерно как Е.Зуева в книге А.Ахо "Компиляторы.." ) bison`и грамматики С++ и HTML? В идеале — интересуют исходники программы SourceMonitor, в которой (по слухам) присутствует первая (C++).
В GCC присутствует грамматика C++.... а в каком смысле корректные? понятные для человека или корректные для bison?
Третий Рим должен пасть!
Re[8]: bison (конфликт сдвига/вывода)
От:
Аноним
Дата:
25.06.10 13:29
Оценка:
Здравствуйте, GhostCoders, Вы писали:
А>>bison`и грамматики С++ и HTML? GC>В GCC присутствует грамматика C++.... а в каком смысле корректные? понятные для человека или корректные для bison?
Та что в gcc-g++-3.3.1-3-src (и т.п.) требует серьезной доработки в связке flex и bison, а этой возни хотелось бы избежать.