		/* Postfix Code Generation */

stmt(['while'|in], code, cptr) => [in3, code4, cptr3+2]
		where [in1, code1, cptr1] = expr(in, code, cptr);
		      in1 = ['do' | in2];
		      code2 = dconc(code1, [[cptr3+2|['jfalse' | x1]] | x1]);
		      cptr2 = cptr1 + 2;
		      [in3, code3, cptr3] <- cmpd(in2, code2, cptr2);
		      code4 =  dconc(code3, [[cptr|['jump' | x2]] | x2]).

stmt(['a' | in], code, cptr) => [in, dconc(code, [['a'|t]|t]), cptr+1].

expr(['be' | in], code, cptr) => [in, dconc(code, [['be'|t]|t]), cptr+1].

cmpd(['begin'|in], code, cptr) => [in2, code1, cptr1]
		where [in1, code1, cptr1] = stmtseq(in, code, cptr);
		      		       in1 = ['end' | in2].

cmpd(in, code, cptr) => stmt(in, code, cptr).

stmtseq(in, code, cptr) => stmtseq2(in1, code1, cptr1)
		where [in1, code1, cptr1] <- stmt(in, code, cptr).

stmtseq2(['end' | in2], code, cptr) => [in, code, cptr].

stmtseq2([';'|in], code, cptr) => stmtseq2(in1, code1, cptr1)
		where  [in1, code1, cptr1] <- stmt(in, code, cptr).

dconc([x|t], [t|y]) => [x|y].

