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); }