bison (конфликт сдвига/вывода)
От: andrey_egeg  
Дата: 20.06.10 14:04
Оценка:
Подскажите как подправить грамматику
bison 2.4.1 конфликты: 1 сдвига/вывода


%start na
%%
na : nb
   | na nb
   ;
nb : 'a' na '#' 'b' 
   | 'c' nc
   | 'd'
   ;
nc :
   | '#' 'e'
   ; 
%%



20.06.10 20:41: Перенесено модератором из 'C/C++' — Кодт
bison
Re: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 20.06.10 16:40
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>na : nb
_>   | na nb
_>   ;

Конечно, бизон мог бы и догадаться, что уравнение
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" ?
      сказка про белого бычка
Перекуём баги на фичи!
Re: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 20.06.10 16:41
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

Да, а поправить нужно так:
_>
_>na : nb
_>   | nb na
_>   ;
_>
Перекуём баги на фичи!
Re[2]: bison (конфликт сдвига/вывода)
От: andrey_egeg  
Дата: 20.06.10 17:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Да, а поправить нужно так:

na : nb
   | nb na
   ;

Только и всего? Не смешно.
Мог бы придумать что нить пооригинальней.
Re[3]: bison (конфликт сдвига/вывода)
От: Ops Россия  
Дата: 20.06.10 18:11
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>Только и всего? Не смешно.

_>Мог бы придумать что нить пооригинальней.

Он придумает, например перенесет в другой форум, на место.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 20.06.10 18:47
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>Только и всего? Не смешно.

_>Мог бы придумать что нить пооригинальней.

Согласен, нагнал.

Ниже нетерминалы с большой буквы.

Видно, что проблема сосредоточена здесь:
A = B | BA
B = aA#b | cC | d
C = | #e

подставляя C в B, и забивая на A, получим
B = aB#b | c | c#e | d

И вот здесь-то и ругается бизон.
Перекуём баги на фичи!
Re: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 20.06.10 19:28
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>Подскажите как подправить грамматику

_>bison 2.4.1 конфликты: 1 сдвига/вывода

Что, если просто задавить эту ошибку?
%start na

%expect 1

%%
.....
Перекуём баги на фичи!
Re[2]: bison (конфликт сдвига/вывода)
От: Xeor Россия  
Дата: 20.06.10 20:56
Оценка:
Здравствуйте, Кодт, Вы писали:

_>>Подскажите как подправить грамматику

_>>bison 2.4.1 конфликты: 1 сдвига/вывода

К>Что, если просто задавить эту ошибку?


И что он сделает встретив, например ac#b? Встретив после 'c' знак '#', парсер сделает сдвиг и будет очень удивлен, встретив 'b' вместо 'e'.
Re[3]: bison (конфликт сдвига/вывода)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 21.06.10 05:33
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>Здравствуйте, Кодт, Вы писали:


К>>Да, а поправить нужно так:

_>
_>na : nb
_>   | nb na
_>   ;
_>

_>Только и всего? Не смешно. :shuffle:
_>Мог бы придумать что нить пооригинальней.

Дело не в том, оригинальней или нет, а в том, что это действительно важная замена для таких простых парсеров, как bison. Левосторонняя рекурсия без оснований ему плохо удаётся.

А хорошую подсказку здесь дал Xeor: пример ac#b разбирается двумя возможными путями. Это в общем-то значит, что исходная грамматика некорректна, и пытаться выкрутить это задавливанием конфликтов бессмысленно — в лучшем случае получите reduce/reduce conflict и он откажет собираться. Исправь на корректную.

P.S. А твоя реплика про "Мог бы придумать что нить пооригинальней" слишком многими может быть воспринята как неконструктивный наезд.
The God is real, unless declared integer.
Re[4]: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 21.06.10 06:44
Оценка:
Здравствуйте, netch80, Вы писали:

N>А хорошую подсказку здесь дал Xeor: пример ac#b разбирается двумя возможными путями. Это в общем-то значит, что исходная грамматика некорректна, и пытаться выкрутить это задавливанием конфликтов бессмысленно — в лучшем случае получите reduce/reduce conflict и он откажет собираться. Исправь на корректную.


Поскольку контекста из одного символа недостаточно для спуска туда или сюда — это не LL(1)-грамматика (да?)

Если мы сделаем фокус, и склеим токены #b и #e на стадии лексера, то всё будет хорошо.

Может быть, ещё какие-то фокусы возможны — как, например, разруливается if-then/if-then-else.
Может быть, нужно ввести приоритеты...
Перекуём баги на фичи!
Re: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 21.06.10 11:19
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

Ха! Я победил бизона!
%start series

%%

// нетерминал xxx_ эквивалентен xxx '#'

series  : elem  | elem series  ;
series_ : elem_ | elem series_ ;

elem  : alfa  | charlie  | delta  ;
elem_ : alfa_ | charlie_ | delta_ ;

alfa  : 'a' series_ 'b'  ;
alfa_ : alfa '#' ;

charlie  : 'c'     | 'c' '#' 'e' ;
charlie_ : 'c' '#' | 'c' '#' 'e' '#' ;

delta  : 'd' ;
delta_ : delta '#' ;

%%


Идея была в следующем: поскольку неоднозначность возникает между c·#b и c·#e — т.е. непонятно, то ли сворачивать прямо сейчас, то ли чуть погодя...
А не сделать ли нам так, чтобы # всегда сдвигался?!
Тогда момент выбора переместится на один шаг вперёд: c#·b или c#·e# — а уж отличить b от e мы сумеем

Написать
charlie  : 'c' | 'c' '#' 'e' ;
charlie_ : 'c' '#' ;

нельзя, поскольку мы здесь опять получим shift/reduce: то ли идти по второй ветке charlie, то ли немедленно сворачивать его.

Единственно, что отягощает — количество дублёров_.



А кстати, это грамматика реальной задачи, или учебно-тренировочной?
Перекуём баги на фичи!
Re: bison (конфликт сдвига/вывода)
От: Xeor Россия  
Дата: 21.06.10 14:08
Оценка:
Здравствуйте, andrey_egeg, Вы писали:

_>Подскажите как подправить грамматику

_>bison 2.4.1 конфликты: 1 сдвига/вывода

А вот похоже штатное средство от таких проблем. Эта грамматика как раз LALR(2) получается.

http://www.gnu.org/software/bison/manual/html_node/Simple-GLR-Parsers.html
Re[2]: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 21.06.10 15:00
Оценка:
Здравствуйте, Xeor, Вы писали:

X>А вот похоже штатное средство от таких проблем. Эта грамматика как раз LALR(2) получается.


X>http://www.gnu.org/software/bison/manual/html_node/Simple-GLR-Parsers.html


Что-то у меня получилось. Ну, добавил %glr-parser, а он как был LALR(1), так и остался.
Можешь показать работающий код?
Перекуём баги на фичи!
Re[3]: bison (конфликт сдвига/вывода)
От: Xeor Россия  
Дата: 21.06.10 15:28
Оценка:
Здравствуйте, Кодт, Вы писали:


К>Что-то у меня получилось. Ну, добавил %glr-parser, а он как был LALR(1), так и остался.

К>Можешь показать работающий код?

Я вживую его не использовал. Парсер-то и останется LALR(1), только в случае неоднозначности ветвится в оба пути, а потом откидывает неудачный вариант.
Re[4]: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 21.06.10 15:39
Оценка:
Здравствуйте, Xeor, Вы писали:

X>Я вживую его не использовал. Парсер-то и останется LALR(1), только в случае неоднозначности ветвится в оба пути, а потом откидывает неудачный вариант.


А, понятно, это у меня в ходе экспериментов закралась опечатка... сейчас заново набил код — всё заработало.
Перекуём баги на фичи!
Re[4]: bison (конфликт сдвига/вывода)
От: andrey_egeg  
Дата: 24.06.10 18:58
Оценка:
Здравствуйте, netch80, Вы писали:


N>Дело не в том, оригинальней или нет..

N>Исправь на корректную.
N>P.S. А твоя реплика про "Мог бы придумать что нить пооригинальней" слишком многими может быть воспринята как неконструктивный наезд.

Смысл упомянутой "реплики про" — это просьба изменить грамматику таким образом, дабы исключить вышеупомянутый конфликт. И, поясни, что "конструктивного" в твоем предложении самому "исправить на корректную", которое с последним — "..наезд." по-сути воспринимается как бестолковый треп.
p.s. решение — пара переставленных строк + оператор %prec и %left(естественно без директивы glr-parser и %expect)
Re[5]: bison (конфликт сдвига/вывода)
От: Кодт Россия  
Дата: 24.06.10 20:07
Оценка:
Здравствуйте, 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++).
Re[7]: bison (конфликт сдвига/вывода)
От: GhostCoders Россия  
Дата: 25.06.10 13:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не у кого не завалялись корректные (примерно как Е.Зуева в книге А.Ахо "Компиляторы.." ) 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, а этой возни хотелось бы избежать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.