|
@@ -242,6 +242,9 @@ static void cPreUnary() {
|
|
|
if((counter & 1) == 0) {
|
|
|
cAddOperation(OP_NOT);
|
|
|
}
|
|
|
+ } else if(cConsumeTokenIf(T_BIT_NOT)) {
|
|
|
+ cPrimary();
|
|
|
+ cAddOperation(OP_BIT_NOT);
|
|
|
} else {
|
|
|
cPrimary();
|
|
|
}
|
|
@@ -280,62 +283,111 @@ static void cAdd() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cComparison() {
|
|
|
+static void cShift() {
|
|
|
cAdd();
|
|
|
while(true) {
|
|
|
- if(cConsumeTokenIf(T_LESS)) {
|
|
|
+ if(cConsumeTokenIf(T_LEFT_SHIFT)) {
|
|
|
cAdd();
|
|
|
+ cAddOperation(OP_LEFT_SHIFT);
|
|
|
+ } else if(cConsumeTokenIf(T_RIGHT_SHIFT)) {
|
|
|
+ cAdd();
|
|
|
+ cAddOperation(OP_RIGHT_SHIFT);
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cComparison() {
|
|
|
+ cShift();
|
|
|
+ while(true) {
|
|
|
+ if(cConsumeTokenIf(T_LESS)) {
|
|
|
+ cShift();
|
|
|
cAddOperation(OP_LESS);
|
|
|
} else if(cConsumeTokenIf(T_LESS_EQUAL)) {
|
|
|
- cAdd();
|
|
|
+ cShift();
|
|
|
cAddOperation(OP_GREATER);
|
|
|
cAddOperation(OP_NOT);
|
|
|
} else if(cConsumeTokenIf(T_GREATER)) {
|
|
|
- cAdd();
|
|
|
+ cShift();
|
|
|
cAddOperation(OP_GREATER);
|
|
|
} else if(cConsumeTokenIf(T_GREATER_EQUAL)) {
|
|
|
- cAdd();
|
|
|
+ cShift();
|
|
|
cAddOperation(OP_LESS);
|
|
|
cAddOperation(OP_NOT);
|
|
|
- } else if(cConsumeTokenIf(T_EQUAL)) {
|
|
|
- cAdd();
|
|
|
- cAddOperation(OP_EQUAL);
|
|
|
- } else if(cConsumeTokenIf(T_NOT_EQUAL)) {
|
|
|
- cAdd();
|
|
|
- cAddOperation(OP_EQUAL);
|
|
|
- cAddOperation(OP_NOT);
|
|
|
} else {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void cLogical() {
|
|
|
+static void cEqual() {
|
|
|
cComparison();
|
|
|
while(true) {
|
|
|
- if(cConsumeTokenIf(T_AND)) {
|
|
|
- cAddOperation(OP_DUPLICATE);
|
|
|
- cAddOperation(OP_IF_GOTO);
|
|
|
- int p = cReserveInt();
|
|
|
+ if(cConsumeTokenIf(T_EQUAL)) {
|
|
|
cComparison();
|
|
|
- cAddOperation(OP_AND);
|
|
|
- cSetInt(p, code->length);
|
|
|
- } else if(cConsumeTokenIf(T_OR)) {
|
|
|
- cAddOperation(OP_DUPLICATE);
|
|
|
- cAddOperation(OP_NOT);
|
|
|
- cAddOperation(OP_IF_GOTO);
|
|
|
- int p = cReserveInt();
|
|
|
+ cAddOperation(OP_EQUAL);
|
|
|
+ } else if(cConsumeTokenIf(T_NOT_EQUAL)) {
|
|
|
cComparison();
|
|
|
- cAddOperation(OP_OR);
|
|
|
- cSetInt(p, code->length);
|
|
|
+ cAddOperation(OP_EQUAL);
|
|
|
+ cAddOperation(OP_NOT);
|
|
|
} else {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void cBitAnd() {
|
|
|
+ cEqual();
|
|
|
+ while(cConsumeTokenIf(T_BIT_AND)) {
|
|
|
+ cEqual();
|
|
|
+ cAddOperation(OP_BIT_AND);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cBitXor() {
|
|
|
+ cBitAnd();
|
|
|
+ while(cConsumeTokenIf(T_BIT_XOR)) {
|
|
|
+ cBitAnd();
|
|
|
+ cAddOperation(OP_BIT_XOR);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cBitOr() {
|
|
|
+ cBitXor();
|
|
|
+ while(cConsumeTokenIf(T_BIT_OR)) {
|
|
|
+ cBitXor();
|
|
|
+ cAddOperation(OP_BIT_OR);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cAnd() {
|
|
|
+ cBitOr();
|
|
|
+ while(cConsumeTokenIf(T_AND)) {
|
|
|
+ cAddOperation(OP_DUPLICATE);
|
|
|
+ cAddOperation(OP_IF_GOTO);
|
|
|
+ int p = cReserveInt();
|
|
|
+ cBitOr();
|
|
|
+ cAddOperation(OP_AND);
|
|
|
+ cSetInt(p, code->length);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cOr() {
|
|
|
+ cAnd();
|
|
|
+ while(cConsumeTokenIf(T_OR)) {
|
|
|
+ cAddOperation(OP_DUPLICATE);
|
|
|
+ cAddOperation(OP_NOT);
|
|
|
+ cAddOperation(OP_IF_GOTO);
|
|
|
+ int p = cReserveInt();
|
|
|
+ cAnd();
|
|
|
+ cAddOperation(OP_OR);
|
|
|
+ cSetInt(p, code->length);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void cExpression() {
|
|
|
- cLogical();
|
|
|
+ cOr();
|
|
|
}
|
|
|
|
|
|
static void cSetVar(const char* literal) {
|
|
@@ -362,6 +414,11 @@ static void cLineLiteral() {
|
|
|
case T_MUL_SET: cOperationSetVar(literal, OP_MUL); break;
|
|
|
case T_DIV_SET: cOperationSetVar(literal, OP_DIV); break;
|
|
|
case T_MOD_SET: cOperationSetVar(literal, OP_MOD); break;
|
|
|
+ case T_BIT_AND_SET: cOperationSetVar(literal, OP_BIT_AND); break;
|
|
|
+ case T_BIT_OR_SET: cOperationSetVar(literal, OP_BIT_OR); break;
|
|
|
+ case T_BIT_XOR_SET: cOperationSetVar(literal, OP_BIT_XOR); break;
|
|
|
+ case T_LEFT_SHIFT_SET: cOperationSetVar(literal, OP_LEFT_SHIFT); break;
|
|
|
+ case T_RIGHT_SHIFT_SET: cOperationSetVar(literal, OP_RIGHT_SHIFT); break;
|
|
|
case T_OPEN_BRACKET: cCallFunction(literal, true); break;
|
|
|
case T_INCREMENT:
|
|
|
cPostIncrement(literal);
|