void Statement() {
		printer.startProduction("Statement"); 
		if (la.kind == 8) {
			Get();
			this.generator.startIf();
			
			Expect(9);
			this.enterParenthesis(BOOLEAN);
			
			Expr();
			Expect(10);
			if (this.currentType != BOOLEAN) {
			// ERROR, non-boolean expression in conditional
			printer.print("Error in if-statement: " + this.currentType);
			this.SemErr("incorrect if-declaration");
			}
			else {
			printer.print("if ok");
			}
			this.exitParenthesis();
			this.resetContext();
			
			Expect(11);
			this.generator.startThen();
			printer.print("then");
			
			Statement();
			Expect(12);
			this.generator.startElse();
			printer.print("else");
			// @SLX: log current line of SLX program and make a conditional jump to here
			
			Statement();
			Expect(13);
			this.generator.startFi();
			printer.print("fi");
			expected = UNDEFINED;
			printer.endProduction("Statement"); 
			
		} else if (la.kind == 14) {
			Get();
			printer.print("while");
			stack.push(BOOLEAN);
			this.generator.startWhile();
			
			Expect(9);
			this.enterParenthesis(BOOLEAN);
			Expr();
			Expect(10);
			if (stack.peek() != BOOLEAN) {
			// ERROR, non-boolean expression
			this.SemErr("incorrect while-declaration");
			}
			else {
				printer.print("while ok");
			}
			this.generator.endWhileConditional();
			this.exitParenthesis();
			this.resetContext();
			
			Statement();
			printer.endProduction("Statement");
			this.generator.endWhileBody();
			
		} else if (la.kind == 15) {
			Get();
			printer.print("print");
			Expect(9);
			Expr();
			Expect(10);
			this.generator.commandPrint();
			
			Expect(6);
			printer.endProduction("Statement"); 
			
		} else if (la.kind == 4) {
			Get();
			StatementList();
			Expect(5);
			printer.endProduction("Statement"); 
			
		} else if (la.kind == 1) {
			IdAccess();
			Expect(16);
			this.currentContext.previousOp = CodeGenerator.ops.ASG;
			this.enterParenthesis(this.currentType);
			
			Expr();
			if (this.lastType == this.expected) {
			this.generator.commandAssignment();
			}
			
			Expect(6);
			this.exitParenthesis();
			this.resetContext();
			printer.endProduction("Statement"); 
			
		} else SynErr(33);
	}