LINUX.ORG.RU

Сообщения igsilya

 

Bison конфликт вывода/вывода (reduce/reduce)

Здравствуйте. Перерыл много разного и, на сколько я понял, шаблонных решений для подобных проблем нет. Прошу помощи.

%union {
double     val; 
symrec  *tptr; 
}


%token <val>  NUM        /* Простое число двойной точности   */
%token <tptr> VAR        /* Переменная                       */
%token IF THEN ELSE REPEAT UNTIL LS GT LE GE EQ NE SEMICOL
%token WRITE WRITEN READ

%type  <val>  exp
%type  <val>  logical_expr

%right '='
%left '-' '+'
%left '*' '/'
%left NEG 
%right '^' 

%%
input: 
        | operator input 
;

operator: SEMICOL
        | exp SEMICOL
        | block
        | if_stmt
        | REPEAT block UNTIL '(' logical_expr ')' SEMICOL   
        | WRITE var_sequence SEMICOL                         
        | WRITEN var_sequence SEMICOL  
        | READ var_sequence SEMICOL  
;

if_stmt:
          IF '(' logical_expr ')' {действие} THEN block 
                                            {действие} ELSE block 
   
        | IF '(' logical_expr ')'  {действие}  THEN block
;         

var_sequence: 
          VAR                  
        | VAR ',' var_sequence 
;

logical_expr:
           exp LS exp 
        |  exp GT exp 
        |  exp LE exp 
        |  exp GE exp
        |  exp EQ exp 
        |  exp NE exp 
;

block: '{' input '}';

exp     : NUM     
        | VAR    
        | VAR '=' exp 
        | exp '+' exp 
        | exp '-' exp
        | exp '*' exp
        | exp '/' exp       
        | '-' exp %prec NEG  
        | exp '^' exp
        | '(' exp ')'  
;
%%

Результат:

interp.y: конфликты: 1 вывода/вывода interp.y:55.35-68: предупреждение: rule useless in parser due to conflicts: $@4: /* пусто */

строка 55 - второй IF (без ELSE) 35-68 - там действие написано

Спасибо.

 

igsilya
()

RSS подписка на новые темы