ref: 66948d9f2f71c593469751b3b022aea1a499c94f
parent: e9f3f4b6f347e80196c224028a80d48099495168
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri Apr 11 12:55:30 EDT 2014
First version af assignments This version is not full functional because types are not checked.
--- a/cc.h
+++ b/cc.h
@@ -221,7 +221,9 @@
OCAST, OPTR, OADD, OARY, OSIZE, OMUL, OSUB,
OINC, ODEC, OPINC, OPDEC, ODIV, OMOD, OSHL,
OSHR, OLT, OGT, OGE, OLE, OEQ, ONE, OBAND,
- OBXOR, OBOR
+ OBXOR, OBOR, OASSIGN, OA_MUL, OA_DIV,
+ OA_MOD, OA_ADD, OA_SUB, OA_SHL, OA_SHR,
+ OA_AND, OA_XOR, OA_OR
};
extern void
--- a/code.c
+++ b/code.c
@@ -26,7 +26,18 @@
[ONE] = "!",
[OBAND] = "&",
[OBXOR] = "^",
- [OBOR] = "|"
+ [OBOR] = "|",
+ [OASSIGN] = ":",
+ [OA_MUL] = ":*",
+ [OA_DIV] = ":/",
+ [OA_MOD] = ":%",
+ [OA_ADD] = ":+",
+ [OA_SUB] = ":-",
+ [OA_SHL] = ":l",
+ [OA_SHR] = ":r",
+ [OA_AND] = ":&",
+ [OA_XOR] = ":^",
+ [OA_OR] = ":|"
};
Node *
--- a/expr.c
+++ b/expr.c
@@ -355,6 +355,10 @@
default: return np;
}
next();
+ /*
+ * FIX: This is incorrect because in relation
+ * we cannot change the order of the operands
+ */
np = arithmetic(op, np, shift());
}
}
@@ -416,6 +420,36 @@
return np;
}
+static Node *
+assign(void)
+{
+ register Node *np = bit_or();
+
+ for (;;) {
+ register char op;
+
+ switch (yytoken) {
+ case '=': op = OASSIGN; break;
+ case MUL_EQ: op = OA_MUL; break;
+ case DIV_EQ: op = OA_DIV; break;
+ case MOD_EQ: op = OA_MOD; break;
+ case ADD_EQ: op = OA_ADD; break;
+ case SUB_EQ: op = OA_SUB; break;
+ case SHL_EQ: op = OA_SHL; break;
+ case SHR_EQ: op = OA_SHR; break;
+ case AND_EQ: op = OA_AND; break;
+ case XOR_EQ: op = OA_XOR; break;
+ case OR_EQ: op = OA_OR; break;
+ default: goto return_np;
+ }
+ next();
+ /* TODO: cast types */
+ np = bincode(op, np->type, np, assign());
+ }
+return_np:
+ return np;
+}
+
Node *
expr(void)
{
@@ -422,7 +456,7 @@
register Node *np;
do
- np = bit_or();
+ np = assign();
while (yytoken == ',');
return np;
}