USG_PG3/usr/source/lil/grammar
%term DECL 3 ',' 4 '(' 5 ')' 6 '"' 7 ';' 8 '[' 9
%term ']' 10 '++' 11 OP 12 '&&' 13 '||' 14 ROP 15 STRING 16
%term IDENT 17 GOTO 18 IF 19 ELSE 20 DO 21 BREAK 22 WHILE 23
%%
prog : thing = {et(); }
| prog thing = {et(); }
thing : ';';
| string ';';
| quotes DECL arglist '"' ';' = {dodecl(v2, v3); endatime(v1, v2); }
| exp ';' = {endexp(v1); }
| GOTO loc ';' = {dogoto(v1, v2); }
| BREAK ';' = {begbreak(v1, NULL); }
| BREAK IDENT ';' = {begbreak(v1, v2); }
| label prog ')' = {endthen(v1); endlabel(v1); }
| '(' prog ')';
| thenpt thing = {endthen(v1); }
| elsept thing = {endthen(v1); }
| looppt thing = {endloop(v1); endthen(v1); }
thenpt : IF test = {begthen(v2); et(); copy(v2); }
elsept : thenpt thing ELSE = {begelse(v1); et(); }
looppt : WHILE test = {begloop(NULL, v2); et(); copy(v2); }
| DO thing WHILE test = {begloop(v1, v4); et(); copy(v4); }
exp : loc;
| exp OP loc = {binop(v1, v2, v3); }
loc : sloc;
| loc '++' = {dopop(v1); }
| label ')' = {endcall(v1, NULL); }
| label arglist ')' = {endcall(v1, v2); }
| loc '[' exp ']' = {index(v1, v3); }
sloc : IDENT;
| quotes exp '"' = {endatime(v1, v2); copy(v2); }
| OP STRING = {alloc(v1, v2); copy(v2); }
| '[' exp ']' = {indir(v2); copy(v2); }
| '(' exp ')' = {set(v2, DCLF, FALSE); copy(v2); }
| OP sloc = {unop(v1, v2); copy(v2); }
arglist : exp = {doarg(v1, NULL); }
| exp ',' arglist = {doarg(v1, v3); }
test : '(' kexp ')' = {copy(v2); }
kexp : kterm;
| kor kterm = {endkbin(v1, v2); }
kor : kexp '||' = {begkbin(v1, v2); }
kterm : kond;
| kand kond = {endkbin(v1, v2); }
kand : kterm '&&' = {begkbin(v1, v2); }
kond : skond;
| ROP = {makond(v1); }
| exp ROP loc = {rop(v1, v2, v3); copy(v2); }
| exp = {rexp(v1); }
skond : quotes kexp '"' = {endatime(v1, v2); copy(v2); }
| '(' kexp ')' = {copy(v2); }
| OP skond = {knot(v1, v2); copy(v2); }
string : STRING = {dostring(v1); }
quotes : '"' = {begatime(v1); }
label : loc '(' = {dolabel(v1); }