Shift/reduce conflicts in IF/THEN/ELSE rules solved.

This commit is contained in:
Martin Mares 1999-11-10 13:05:57 +00:00
parent f453665704
commit 4995564570

View file

@ -36,10 +36,10 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, CONST,
FILTER FILTER
) )
%nonassoc ELSE
%nonassoc THEN %nonassoc THEN
%nonassoc ELSE ';'
%type <x> term block cmds cmd function_body ifthen constant print_one print_list var_list var_listn any_dynamic %type <x> term block cmds cmd function_body constant print_one print_list var_list var_listn any_dynamic
%type <f> filter filter_body %type <f> filter filter_body
%type <i> type break_command pair %type <i> type break_command pair
%type <e> set_item set_items switch_body %type <e> set_item set_items switch_body
@ -213,7 +213,6 @@ set_items:
| set_items ',' set_item { $$ = $3; $$->left = $1; } | set_items ',' set_item { $$ = $3; $$->left = $1; }
; ;
/* 2 shift/reduce conflicts here. Curable by replacing cmds with block which breaks syntax */
switch_body: /* EMPTY */ { $$ = NULL; } switch_body: /* EMPTY */ { $$ = NULL; }
| set_item ':' cmds switch_body { | set_item ':' cmds switch_body {
$$ = $1; $$ = $1;
@ -294,15 +293,6 @@ break_command:
| PRINTN { $$ = F_NONL } | PRINTN { $$ = F_NONL }
; ;
ifthen:
IF term THEN block {
$$ = f_new_inst();
$$->code = '?';
$$->a1.p = $2;
$$->a2.p = $4;
}
;
print_one: print_one:
term { $$ = f_new_inst(); $$->code = 'p'; $$->a1.p = $1; $$->a2.p = NULL; } term { $$ = f_new_inst(); $$->code = 'p'; $$->a1.p = $1; $$->a2.p = NULL; }
; ;
@ -337,15 +327,21 @@ var_list: /* EMPTY */ { $$ = NULL; }
; ;
cmd: cmd:
ifthen { IF term THEN block {
$$ = $1;
}
/* FIXME: this leads to shift/reduce conflict. */
| ifthen ELSE block {
$$ = f_new_inst(); $$ = f_new_inst();
$$->code = '?'; $$->code = '?';
$$->a1.p = $1; $$->a1.p = $2;
$$->a2.p = $3; $$->a2.p = $4;
}
| IF term THEN block ELSE block {
struct f_inst *i = f_new_inst();
i->code = '?';
i->a1.p = $2;
i->a2.p = $4;
$$ = f_new_inst();
$$->code = '?';
$$->a1.p = i;
$$->a2.p = $6;
} }
| SYM '=' term ';' { | SYM '=' term ';' {
$$ = f_new_inst(); $$ = f_new_inst();