|  | @@ -330,7 +330,6 @@ static void cExpression() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void cSetVar(const char* literal) {
 | 
	
		
			
				|  |  |      cExpression();
 | 
	
		
			
				|  |  | -    cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  |      cAddOperation(OP_SET);
 | 
	
		
			
				|  |  |      cAddInt(cAddVar(literal));
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -340,18 +339,13 @@ static void cLineLiteral() {
 | 
	
		
			
				|  |  |      Token t = cReadTokenAndLine();
 | 
	
		
			
				|  |  |      switch(t) {
 | 
	
		
			
				|  |  |          case T_SET: cSetVar(literal); break;
 | 
	
		
			
				|  |  | -        case T_OPEN_BRACKET:
 | 
	
		
			
				|  |  | -            cCallFunction(literal, true);
 | 
	
		
			
				|  |  | -            cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  | -            break;
 | 
	
		
			
				|  |  | +        case T_OPEN_BRACKET: cCallFunction(literal, true); break;
 | 
	
		
			
				|  |  |          case T_INCREMENT:
 | 
	
		
			
				|  |  |              cPostIncrement(literal);
 | 
	
		
			
				|  |  | -            cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  |              cAddOperation(OP_POP);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          case T_DECREMENT:
 | 
	
		
			
				|  |  |              cPostDecrement(literal);
 | 
	
		
			
				|  |  | -            cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  |              cAddOperation(OP_POP);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          default: cUnexpectedToken(t);
 | 
	
	
		
			
				|  | @@ -498,30 +492,58 @@ static void cWhile() {
 | 
	
		
			
				|  |  |      cSetInt(ifP, code->length);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void cLine(Token t) {
 | 
	
		
			
				|  |  | -    cAddOperation(OP_LINE);
 | 
	
		
			
				|  |  | -    cAddInt16(line);
 | 
	
		
			
				|  |  | +static void cLineExpression(Token t) {
 | 
	
		
			
				|  |  |      switch(t) {
 | 
	
		
			
				|  |  | -        case T_PRINT: cPrint(); break;
 | 
	
		
			
				|  |  |          case T_LITERAL: cLineLiteral(); break;
 | 
	
		
			
				|  |  | -        case T_FUNCTION: cFunction(); break;
 | 
	
		
			
				|  |  | -        case T_RETURN: cReturn(); break;
 | 
	
		
			
				|  |  | -        case T_IF: cIf(); break;
 | 
	
		
			
				|  |  | -        case T_WHILE: cWhile(); break;
 | 
	
		
			
				|  |  |          case T_INCREMENT:
 | 
	
		
			
				|  |  |              cPreIncrement();
 | 
	
		
			
				|  |  | -            cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  |              cAddOperation(OP_POP);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          case T_DECREMENT:
 | 
	
		
			
				|  |  |              cPreDecrement();
 | 
	
		
			
				|  |  | -            cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  |              cAddOperation(OP_POP);
 | 
	
		
			
				|  |  |              break;
 | 
	
		
			
				|  |  |          default: cUnexpectedToken(t);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static void cFor() {
 | 
	
		
			
				|  |  | +    cConsumeToken(T_OPEN_BRACKET);
 | 
	
		
			
				|  |  | +    cLineExpression(cReadTokenAndLine());
 | 
	
		
			
				|  |  | +    cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  | +    int startCheck = code->length;
 | 
	
		
			
				|  |  | +    cExpression();
 | 
	
		
			
				|  |  | +    cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  | +    cAddOperation(OP_IF_GOTO);
 | 
	
		
			
				|  |  | +    int end = cReserveInt();
 | 
	
		
			
				|  |  | +    cAddOperation(OP_GOTO);
 | 
	
		
			
				|  |  | +    int beginBody = cReserveInt();
 | 
	
		
			
				|  |  | +    int startPerLoop = code->length;
 | 
	
		
			
				|  |  | +    cLineExpression(cReadTokenAndLine());
 | 
	
		
			
				|  |  | +    cAddOperation(OP_GOTO);
 | 
	
		
			
				|  |  | +    cAddInt(startCheck);
 | 
	
		
			
				|  |  | +    cConsumeToken(T_CLOSE_BRACKET);
 | 
	
		
			
				|  |  | +    cSetInt(beginBody, code->length);
 | 
	
		
			
				|  |  | +    cConsumeBody();
 | 
	
		
			
				|  |  | +    cAddOperation(OP_GOTO);
 | 
	
		
			
				|  |  | +    cAddInt(startPerLoop);
 | 
	
		
			
				|  |  | +    cSetInt(end, code->length);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void cLine(Token t) {
 | 
	
		
			
				|  |  | +    cAddOperation(OP_LINE);
 | 
	
		
			
				|  |  | +    cAddInt16(line);
 | 
	
		
			
				|  |  | +    switch(t) {
 | 
	
		
			
				|  |  | +        case T_PRINT: cPrint(); break;
 | 
	
		
			
				|  |  | +        case T_FUNCTION: cFunction(); break;
 | 
	
		
			
				|  |  | +        case T_RETURN: cReturn(); break;
 | 
	
		
			
				|  |  | +        case T_IF: cIf(); break;
 | 
	
		
			
				|  |  | +        case T_WHILE: cWhile(); break;
 | 
	
		
			
				|  |  | +        case T_FOR: cFor(); break;
 | 
	
		
			
				|  |  | +        default: cLineExpression(t); cConsumeToken(T_SEMICOLON);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static void cForEachLine() {
 | 
	
		
			
				|  |  |      Token t = cReadTokenAndLine();
 | 
	
		
			
				|  |  |      while(t != T_END) {
 |