|
@@ -330,7 +330,6 @@ static void cExpression() {
|
|
|
|
|
|
static void cSetVar(const char* literal) {
|
|
static void cSetVar(const char* literal) {
|
|
cExpression();
|
|
cExpression();
|
|
- cConsumeToken(T_SEMICOLON);
|
|
|
|
cAddOperation(OP_SET);
|
|
cAddOperation(OP_SET);
|
|
cAddInt(cAddVar(literal));
|
|
cAddInt(cAddVar(literal));
|
|
}
|
|
}
|
|
@@ -340,18 +339,13 @@ static void cLineLiteral() {
|
|
Token t = cReadTokenAndLine();
|
|
Token t = cReadTokenAndLine();
|
|
switch(t) {
|
|
switch(t) {
|
|
case T_SET: cSetVar(literal); break;
|
|
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:
|
|
case T_INCREMENT:
|
|
cPostIncrement(literal);
|
|
cPostIncrement(literal);
|
|
- cConsumeToken(T_SEMICOLON);
|
|
|
|
cAddOperation(OP_POP);
|
|
cAddOperation(OP_POP);
|
|
break;
|
|
break;
|
|
case T_DECREMENT:
|
|
case T_DECREMENT:
|
|
cPostDecrement(literal);
|
|
cPostDecrement(literal);
|
|
- cConsumeToken(T_SEMICOLON);
|
|
|
|
cAddOperation(OP_POP);
|
|
cAddOperation(OP_POP);
|
|
break;
|
|
break;
|
|
default: cUnexpectedToken(t);
|
|
default: cUnexpectedToken(t);
|
|
@@ -498,30 +492,58 @@ static void cWhile() {
|
|
cSetInt(ifP, code->length);
|
|
cSetInt(ifP, code->length);
|
|
}
|
|
}
|
|
|
|
|
|
-static void cLine(Token t) {
|
|
|
|
- cAddOperation(OP_LINE);
|
|
|
|
- cAddInt16(line);
|
|
|
|
|
|
+static void cLineExpression(Token t) {
|
|
switch(t) {
|
|
switch(t) {
|
|
- case T_PRINT: cPrint(); break;
|
|
|
|
case T_LITERAL: cLineLiteral(); 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:
|
|
case T_INCREMENT:
|
|
cPreIncrement();
|
|
cPreIncrement();
|
|
- cConsumeToken(T_SEMICOLON);
|
|
|
|
cAddOperation(OP_POP);
|
|
cAddOperation(OP_POP);
|
|
break;
|
|
break;
|
|
case T_DECREMENT:
|
|
case T_DECREMENT:
|
|
cPreDecrement();
|
|
cPreDecrement();
|
|
- cConsumeToken(T_SEMICOLON);
|
|
|
|
cAddOperation(OP_POP);
|
|
cAddOperation(OP_POP);
|
|
break;
|
|
break;
|
|
default: cUnexpectedToken(t);
|
|
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() {
|
|
static void cForEachLine() {
|
|
Token t = cReadTokenAndLine();
|
|
Token t = cReadTokenAndLine();
|
|
while(t != T_END) {
|
|
while(t != T_END) {
|