Конфликты Bison Shift/Reduce для небольшого парсера языка

Моя цель - создать парсер для небольшого языка. В настоящее время он дает мне одну ошибку сдвига/уменьшения.

Мой CFG где-то неоднозначен, но я не могу понять, где

prog:    PROGRAM beg                   {$$ = "program" $2;}
    |   PROGRAM stmt beg               {$$ = "program" $2 $3;}

beg:    BEG stmt END                   {$$ = "begin" $2 "end";}
    | BEG END                      {$$ = "begin" "end";}


stmt:   beg             {$$ = $1;}
    | if_stmt                   {$$ = $1;}/*
    | IF expr THEN stmt                 {$$ = $1 $2 $3 $4;}*/
    | WHILE expr beg                    {$$ = "while" $2 $3;}
    | VAR COLEQUALS arithexpr SEMI      {$$ = $1 ":=" $3 ";";}
    | VAR COLON INTEGER SEMI            {$$ = $1 ":" "integer" ";";} /*Declaring an integer */
    | VAR COLON REAL SEMI               {$$ $1 ":" "real" ";";}   /*declaring a real */

if_stmt:  IF expr THEN stmt            {$$ = "if" $2 "then" $4;}
    | IF expr THEN stmt ELSE stmt      {$$ = "if" $2 "then" $4 "else" $6;}

expr:   NOT VAR                        {$$ = "!" $2;}
| VAR GREATERTHAN arithexpr        {$$ = $1 ">" $3;}
    | VAR LESSTHAN arithexpr           {$$ = $1 "<" $3;}
    | VAR GREATERTHANEQUALTO arithexpr {$$ = $1 ">=" $3;}
    | VAR LESSTHANEQUALTO arithexpr    {$$ = $1 "<=" $3;}
    | VAR EQUALS arithexpr             {$$ = $1 "==" $3;}
    | VAR NOTEQUALS arithexpr          {$$ = $1 "!=" $3;}
    | arithexpr AND arithexpr          {$$ = $1 "&&" $3;}
    | arithexpr OR arithexpr           {$$ = $1 "||" $3;}


arithexpr:  arithexpr PLUS term            {$$ = $1 + $3;}
    |  arithexpr MINUS term            {$$ = $1 - $3;}
    |   term                   {$$ = $1;}

term:   term TIMES factor          {$$ = $1 * $3;}
    | term DIVIDE factor           {$$ = $1 / $3;}
    | factor               {$$ = $1;}

factor:   VAL                              {$$ = $1;}

person Christopher Shifflett    schedule 12.03.2013    source источник
comment
Разве Bison не дает вам никаких подсказок в сообщении об ошибке, где находится конфликт?   -  person 500 - Internal Server Error    schedule 12.03.2013
comment
Он только говорит вам, сколько конфликтов у вас есть, а не где они находятся. Ошибки, с другой стороны, даны вам   -  person Christopher Shifflett    schedule 12.03.2013
comment
Используйте параметр -v, чтобы получить файл .output, показывающий, где и какие конфликты...   -  person Chris Dodd    schedule 13.03.2013


Ответы (1)


person    schedule
comment
Большое спасибо, это действительно помогло! - person Christopher Shifflett; 13.03.2013