У меня проблема с пониманием конфликта shift/reduce для грамматики, которая, как я знаю, не имеет двусмысленности. Случай является одним из типов if else, но это не проблема с "болтающимся другим", поскольку у меня есть обязательные предложения END, ограничивающие блоки кода.
Вот грамматика для gppg (его бизон, как компилятор компилятора... и это не было эхом):
%output=program.cs
%start program
%token FOR
%token END
%token THINGS
%token WHILE
%token SET
%token IF
%token ELSEIF
%token ELSE
%%
program : statements
        ;
statements : /*empty */
           | statements stmt
           ;
stmt : flow
     | THINGS
     ;
flow : '#' IF '(' ')' statements else
     ;
else : '#' END
     | '#' ELSE statements '#' END
     | elseifs
     ;
elseifs : elseifs '#' ELSEIF statements else
        | '#' ELSEIF statements else
        ;
Вот вывод конфликта:
// Parser Conflict Information for grammar file "program.y"
Shift/Reduce conflict on symbol "'#'", parser will shift
 Reduce 10: else -> elseifs
 Shift "'#'":   State-22 -> State-23
  Items for From-state State 22
    10 else: elseifs .
    -lookahead: '#', THINGS, EOF
    11 elseifs: elseifs . '#' ELSEIF statements else 
  Items for Next-state State 23
    11 elseifs: elseifs '#' . ELSEIF statements else 
// End conflict information for parser
Я уже переключил все вокруг, и я знаю, как его решить, но это решение включает отказ от левой рекурсии на "elseif" для правильной рекурсии.
Я прошел через всю скудную документацию, которую я нашел в Интернете по этой проблеме (я публикую некоторые ссылки в конце) и до сих пор не нашел элегантного решения. Я знаю об ANTLR, и я не хочу сейчас это рассматривать. Ограничьте свое решение анализаторами Yacc/Bison.
Я был бы признателен за элегантные решения, мне удалось это сделать, установив /* empty */rules и дублируя все, что требовало пустого списка, но в большей грамматике Im, работающей над ней, просто заканчивается как "синдром грамматики спагетти".
Вот несколько ссылок:
http://nitsan.org/~maratb/cs164/bison.html
http://compilers.iecc.com/comparch/article/98-01-079
