Здравствуйте. Перерыл много разного и, на сколько я понял, шаблонных решений для подобных проблем нет. Прошу помощи.
%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 - там действие написано
Спасибо.