|
@@ -63,22 +63,26 @@ static bool cConsumeTokenIf(Token t) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-static bool cConstant() {
|
|
|
+static bool cExpression();
|
|
|
+
|
|
|
+static bool cPrimary() {
|
|
|
if(cConsumeTokenIf(T_INT)) {
|
|
|
int value;
|
|
|
return tReadInt(&value) && cAddOperation(OP_PUSH_INT) && cAddBytes(&value, sizeof(int));
|
|
|
} else if(cConsumeTokenIf(T_NULL)) {
|
|
|
return cAddOperation(OP_PUSH_NULL);
|
|
|
+ } else if(cConsumeTokenIf(T_OPEN_BRACKET)) {
|
|
|
+ return cExpression() && cConsumeToken(T_CLOSE_BRACKET);
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
static bool cMul() {
|
|
|
- if(!cConstant()) {
|
|
|
+ if(!cPrimary()) {
|
|
|
return false;
|
|
|
}
|
|
|
while(cConsumeTokenIf(T_MUL)) {
|
|
|
- if(!cConstant() || !cAddOperation(OP_MUL)) {
|
|
|
+ if(!cPrimary() || !cAddOperation(OP_MUL)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -97,8 +101,12 @@ static bool cAdd() {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool cExpression() {
|
|
|
+ return cAdd();
|
|
|
+}
|
|
|
+
|
|
|
static bool cPrint() {
|
|
|
- return cAdd() && cConsumeToken(T_SEMICOLON) && cAddOperation(OP_PRINT);
|
|
|
+ return cExpression() && cConsumeToken(T_SEMICOLON) && cAddOperation(OP_PRINT);
|
|
|
}
|
|
|
|
|
|
static bool cLine() {
|