error.y
.
En el se muestra el tercer caso x:y{Ty} con
x = list, T = , e y = NUMBER:
%{ #include <stdio.h> void put(double x); void err(int code); %} %union { double val; } %token <val>NUMBER %% command : | command list '\n' { yyerrok; } ; list : NUMBER { put($1); } | list ',' NUMBER { put($3); yyerrok; } | error { err(1); } | list error { err(2); } | list error NUMBER { err(3); put($3); yyerrok; } | list ',' error { err(4); } ; %% void put(double x) { printf("%2.1lf\n",x); } void err(int code) { printf("err %d\n",code); } main() { yydebug = 1; yyparse(); } yyerror(char *s) { printf("%s\n",s); }
yacc
da lugar a una tabla ligeramente diferente
de la producida por bison
.
El fichero y.output
contiene la tabla:
0 $accept : command $end 1 command : 2 | command list '\n' 3 list : NUMBER 4 | list ',' NUMBER 5 | error 6 | list error 7 | list error NUMBER 8 | list ',' error state 0 $accept : . command $end (0) command : . (1) . reduce 1 command goto 1 state 1 $accept : command . $end (0) command : command . list '\n' (2) $end accept error shift 2 NUMBER shift 3 . error list goto 4 state 2 list : error . (5) . reduce 5 state 3 list : NUMBER . (3) . reduce 3 state 4 command : command list . '\n' (2) list : list . ',' NUMBER (4) list : list . error (6) list : list . error NUMBER (7) list : list . ',' error (8) error shift 5 '\n' shift 6 ',' shift 7 . error state 5 list : list error . (6) list : list error . NUMBER (7) NUMBER shift 8 error reduce 6 '\n' reduce 6 ',' reduce 6 state 6 command : command list '\n' . (2) . reduce 2 state 7 list : list ',' . NUMBER (4) list : list ',' . error (8) error shift 9 NUMBER shift 10 . error state 8 list : list error NUMBER . (7) . reduce 7 state 9 list : list ',' error . (8) . reduce 8 state 10 list : list ',' NUMBER . (4) . reduce 4 5 terminals, 3 nonterminals 9 grammar rules, 11 states
> error yydebug: state 0, reducing by rule 1 (command :) yydebug: after reduction, shifting from state 0 to state 1 10 20 yydebug: state 1, reading 257 (NUMBER) yydebug: state 1, shifting to state 3 yydebug: state 3, reducing by rule 3 (list : NUMBER) 10.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 257 (NUMBER) syntax error yydebug: state 4, error recovery shifting to state 5 yydebug: state 5, shifting to state 8 yydebug: state 8, reducing by rule 7 (list : list error NUMBER) err 3 20.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 10 ('\n') yydebug: state 4, shifting to state 6 yydebug: state 6, reducing by rule 2 (command : command list '\n') yydebug: after reduction, shifting from state 0 to state 1 10;20 30 yydebug: state 1, reading 257 (NUMBER) yydebug: state 1, shifting to state 3 yydebug: state 3, reducing by rule 3 (list : NUMBER) 10.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 59 (illegal-symbol) syntax error yydebug: state 4, error recovery shifting to state 5 yydebug: state 5, error recovery discards token 59 (illegal-symbol) yydebug: state 5, reading 257 (NUMBER) yydebug: state 5, shifting to state 8 yydebug: state 8, reducing by rule 7 (list : list error NUMBER) err 3 20.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 257 (NUMBER) syntax error yydebug: state 4, error recovery shifting to state 5 yydebug: state 5, shifting to state 8 yydebug: state 8, reducing by rule 7 (list : list error NUMBER) err 3 30.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 10 ('\n') yydebug: state 4, shifting to state 6 yydebug: state 6, reducing by rule 2 (command : command list '\n') yydebug: after reduction, shifting from state 0 to state 1 3, yydebug: state 1, reading 257 (NUMBER) yydebug: state 1, shifting to state 3 yydebug: state 3, reducing by rule 3 (list : NUMBER) 3.0 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, reading 44 (',') yydebug: state 4, shifting to state 7 yydebug: state 7, reading 10 ('\n') syntax error yydebug: state 7, error recovery shifting to state 9 yydebug: state 9, reducing by rule 8 (list : list ',' error) err 4 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, shifting to state 6 yydebug: state 6, reducing by rule 2 (command : command list '\n') yydebug: after reduction, shifting from state 0 to state 1 # yydebug: state 1, reading 35 (illegal-symbol) syntax error yydebug: state 1, error recovery shifting to state 2 yydebug: state 2, reducing by rule 5 (list : error) err 1 yydebug: after reduction, shifting from state 1 to state 4 yydebug: state 4, error recovery discards token 35 (illegal-symbol) yydebug: state 4, reading 10 ('\n') yydebug: state 4, shifting to state 6 yydebug: state 6, reducing by rule 2 (command : command list '\n') yydebug: after reduction, shifting from state 0 to state 1 yydebug: state 1, reading 0 (end-of-file)
Casiano Rodríguez León