txlyre 1 mēnesi atpakaļ
vecāks
revīzija
fb8a1d6d34
1 mainītis faili ar 68 papildinājumiem un 2 dzēšanām
  1. 68 2
      qic.c

+ 68 - 2
qic.c

@@ -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;