/* I am extending yacc's grammar in two aspects: (1), string literals
* are legal where character literals are legal, and (2), the first
* ("declarations") part is as optional as the trailer. Both changes
* are intended to allow conversion of arbitrary grammars, rather than
* just YACC's specific input format.
*/
%token <list> WS CCODE PREFIX ID CURLS TAG NUMBER RWORD TOKEN
%token MARK START UNION PREC
%type <list> ws spec tail defs def nlist name rules rule body prec elem elems
%type <list> r_rules
%union {
struct list * list;
}
%%
spec: ws defs MARK ws rules tail
spec: ws rules tail
;
ws: ws WS
| /* empty */
;
tail: MARK
| ws
;
defs: defs def
| error WS
| ws
;
def: START ws ID ws
| UNION ws CCODE ws
| TOKEN ws TAG ws nlist
| TOKEN ws nlist
| RWORD ws TAG ws nlist
| RWORD ws nlist
| CURLS ws
;
nlist: name
| nlist name
| nlist ',' ws name
;
name: ID ws
| ID ws NUMBER ws
;
rules: PREFIX ws body prec r_rules
;
r_rules: /* empty */
| r_rules rule
;
rule: PREFIX ws body prec
| '|' ws body prec
;
body: /* empty */
| elems
;
elems: elem
| elems elem
;
elem: ID ws
| CCODE ws
;
prec: /* empty */
| PREC ws ID ws
| PREC ws ID ws CCODE ws
| prec ';' ws
;
%%