txlyre hai 2 días
pai
achega
f74b0e779a
Modificáronse 1 ficheiros con 18 adicións e 0 borrados
  1. 18 0
      qic.c

+ 18 - 0
qic.c

@@ -329,6 +329,8 @@ typedef struct {
     T_BARASSIGN,
     T_ANDASSIGN,
     T_RAISEASSIGN,
+    T_LTLTASSIGN,
+    T_GTGTASSIGN,
     T_BARBAR,
     T_ANDAND,
     T_STARSTAR,
@@ -718,6 +720,10 @@ token_t *next_token(char *source, size_t *pos) {
     return TK(ANDASSIGN);
   else if (strncmp(&source[*pos], "^=", 2) == 0 && ++(*pos) && ++(*pos))
     return TK(RAISEASSIGN);
+  else if (strncmp(&source[*pos], "<<=", 3) == 0 && ++(*pos) && ++(*pos) && ++(*pos))
+    return TK(LTLTASSIGN);
+  else if (strncmp(&source[*pos], ">>=", 3) == 0 && ++(*pos) && ++(*pos) && ++(*pos))
+    return TK(GTGTASSIGN);
   else if (strncmp(&source[*pos], "||", 2) == 0 && ++(*pos) && ++(*pos))
     return TK(BARBAR);
   else if (strncmp(&source[*pos], "&&", 2) == 0 && ++(*pos) && ++(*pos))
@@ -868,6 +874,8 @@ struct _node_t {
     N_ASSIGN_BOR,
     N_ASSIGN_BAND,
     N_ASSIGN_XOR,
+    N_ASSIGN_SHL,
+    N_ASSIGN_SHR,
 
     N_EQUALS,
     N_NOTEQUALS,
@@ -1703,6 +1711,14 @@ node_t *parse_assignment(list_t *tokens, size_t *pos) {
     node_t *b = parse_assignment(tokens, pos);
 
     return NODE2(ASSIGN_XOR, a, b);
+  } else if (MATCH(LTLTASSIGN)) {
+    node_t *b = parse_assignment(tokens, pos);
+
+    return NODE2(ASSIGN_SHL, a, b);
+  } else if (MATCH(GTGTASSIGN)) {
+    node_t *b = parse_assignment(tokens, pos);
+
+    return NODE2(ASSIGN_SHR, a, b);
   }
 
   return a;
@@ -4004,6 +4020,8 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab, sta
     case N_ASSIGN_BOR: COMPASSIGN(node->a, "bor", compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->b)); break;
     case N_ASSIGN_BAND: COMPASSIGN(node->a, "band", compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->b)); break;
     case N_ASSIGN_XOR: COMPASSIGN(node->a, "xor", compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->b)); break;
+    case N_ASSIGN_SHL: COMPASSIGN(node->a, "shl", compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->b)); break;
+    case N_ASSIGN_SHR: COMPASSIGN(node->a, "shr", compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->b)); break;
 
     case N_INC: 
       COMPASSIGN(node->a, "add", EMIT("state->one"));