|
@@ -17,7 +17,7 @@ static u8 tokens[MAX_TOKENS] = {};
|
|
|
static size_t tokenReadIndex = 0;
|
|
static size_t tokenReadIndex = 0;
|
|
|
static size_t tokenWriteIndex = 0;
|
|
static size_t tokenWriteIndex = 0;
|
|
|
|
|
|
|
|
-typedef enum : u8 { LITERAL, INT64, DOUBLE, STRING, NEWLINE, END } Token;
|
|
|
|
|
|
|
+typedef enum : u8 { LITERAL, INT64, DOUBLE, STRING, PLUS, NEWLINE, END } Token;
|
|
|
|
|
|
|
|
#define THROW_ERROR(...) \
|
|
#define THROW_ERROR(...) \
|
|
|
snprintf(error.text, sizeof(error.text), __VA_ARGS__); \
|
|
snprintf(error.text, sizeof(error.text), __VA_ARGS__); \
|
|
@@ -165,6 +165,9 @@ static void tokenizeLineString(const char* s) {
|
|
|
break;
|
|
break;
|
|
|
} else if(c == ' ') {
|
|
} else if(c == ' ') {
|
|
|
s++;
|
|
s++;
|
|
|
|
|
+ } else if(c == '+') {
|
|
|
|
|
+ addToken(PLUS);
|
|
|
|
|
+ s++;
|
|
|
} else if(c == '\0') {
|
|
} else if(c == '\0') {
|
|
|
break;
|
|
break;
|
|
|
} else {
|
|
} else {
|
|
@@ -256,6 +259,9 @@ static double readDouble() {
|
|
|
THROW_ERROR(
|
|
THROW_ERROR(
|
|
|
"Unexpected string(%s) on line %zu", readString(), lineCounter);
|
|
"Unexpected string(%s) on line %zu", readString(), lineCounter);
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case PLUS:
|
|
|
|
|
+ THROW_ERROR("Unexpected plus on line %zu", lineCounter);
|
|
|
|
|
+ break;
|
|
|
case NEWLINE:
|
|
case NEWLINE:
|
|
|
THROW_ERROR("Unexpected newline on line %zu", lineCounter);
|
|
THROW_ERROR("Unexpected newline on line %zu", lineCounter);
|
|
|
break;
|
|
break;
|
|
@@ -264,7 +270,7 @@ static double readDouble() {
|
|
|
THROW_ERROR("Unexpected unknown token on line %zu", lineCounter);
|
|
THROW_ERROR("Unexpected unknown token on line %zu", lineCounter);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void compileExpression() {
|
|
|
|
|
|
|
+static void compileConstant() {
|
|
|
Token t = nextToken();
|
|
Token t = nextToken();
|
|
|
if(t == STRING) {
|
|
if(t == STRING) {
|
|
|
CODE(codePushInstruction(PUSH_CONSTANT_STRING));
|
|
CODE(codePushInstruction(PUSH_CONSTANT_STRING));
|
|
@@ -277,6 +283,19 @@ static void compileExpression() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static void compileAdd() {
|
|
|
|
|
+ compileConstant();
|
|
|
|
|
+ while(peekToken() == PLUS) {
|
|
|
|
|
+ nextToken();
|
|
|
|
|
+ compileConstant();
|
|
|
|
|
+ CODE(codePushInstruction(ADD));
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static void compileExpression() {
|
|
|
|
|
+ compileAdd();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static void compileLine(Token t) {
|
|
static void compileLine(Token t) {
|
|
|
if(t != LITERAL) {
|
|
if(t != LITERAL) {
|
|
|
unexpectedToken(t);
|
|
unexpectedToken(t);
|