|
@@ -413,6 +413,56 @@ token_t *next_token(char *source, size_t *pos) {
|
|
|
|
|
|
char c = source[(*pos)++];
|
|
|
|
|
|
+ if (c == '\\') {
|
|
|
+ char nc = source[(*pos)++];
|
|
|
+
|
|
|
+ if (!nc)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ switch (nc) {
|
|
|
+ case 'n':
|
|
|
+ buffer_appends(text, "\\n");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 't':
|
|
|
+ buffer_appends(text, "\\t");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'r':
|
|
|
+ buffer_appends(text, "\\r");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'b':
|
|
|
+ buffer_appends(text, "\\b");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'e':
|
|
|
+ buffer_appends(text, "\\e");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 's':
|
|
|
+ buffer_appends(text, " ");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case '"':
|
|
|
+ buffer_appends(text, "\\\"");
|
|
|
+ break;
|
|
|
+
|
|
|
+ case '\\':
|
|
|
+ buffer_appends(text, "\\\\");
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ buffer_append(text, nc);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (c == '"' || c == '\\')
|
|
|
+ buffer_append(text, '\\');
|
|
|
+
|
|
|
buffer_append(text, c);
|
|
|
}
|
|
|
|
|
@@ -525,8 +575,6 @@ token_t *next_token(char *source, size_t *pos) {
|
|
|
LEX_ERROR("unexpected input")
|
|
|
}
|
|
|
|
|
|
-#define NEXT()
|
|
|
-
|
|
|
list_t *tokenize(char *source) {
|
|
|
size_t pos = 0;
|
|
|
list_t *toks = list_new();
|
|
@@ -576,6 +624,8 @@ struct _node_t {
|
|
|
N_ASSIGN,
|
|
|
N_ASSIGN_ADD,
|
|
|
|
|
|
+ N_EQUALS,
|
|
|
+
|
|
|
N_INC,
|
|
|
N_DEC,
|
|
|
|
|
@@ -975,6 +1025,18 @@ node_t *parse_relation(list_t *tokens, size_t *pos) {
|
|
|
node_t *parse_equality(list_t *tokens, size_t *pos) {
|
|
|
node_t *a = parse_relation(tokens, pos);
|
|
|
|
|
|
+ do {
|
|
|
+ if (MATCH(EQUALS)) {
|
|
|
+ node_t *b = parse_relation(tokens, pos);
|
|
|
+
|
|
|
+ a = NODE2(EQUALS, a, b);
|
|
|
+
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ } while (1);
|
|
|
+
|
|
|
return a;
|
|
|
}
|
|
|
|
|
@@ -1688,6 +1750,10 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, nod
|
|
|
compile_func(gbuf, buf, ctx, lstk, node);
|
|
|
break;
|
|
|
|
|
|
+ case N_EQUALS:
|
|
|
+ BINOP("equals");
|
|
|
+ break;
|
|
|
+
|
|
|
case N_ADD:
|
|
|
BINOP("add");
|
|
|
break;
|