ref: 7aee6a0c93f31167634482a65722f9c7c75d80d3
parent: b5f5fb997e89d3189022f62f51b5cc4fbf6d9bbb
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Apr 17 21:41:28 EDT 2016
[cc2] Do not use the token as node op This was a very easy way of parsing, but it created a dependency that is too hard, and it also created the ugly enum where we define all the constnats of cc2.
--- a/cc2/parser.c
+++ b/cc2/parser.c
@@ -43,91 +43,91 @@
void (*eval)(void);
void (*parse)(char *token, union tokenop);
union tokenop u;
-} optbl[] = { /* eval parse args */- [AUTO] = { vardecl, symbol, .u.op = OAUTO},- [REG] = { vardecl, symbol, .u.op = OREG},- [GLOB] = { vardecl, symbol, .u.op = OMEM},- [EXTRN] = { vardecl, symbol, .u.op = OMEM},- [PRIVAT] = { vardecl, symbol, .u.op = OMEM},- [LOCAL] = { vardecl, symbol, .u.op = OMEM},- [MEMBER] = { flddecl, symbol, .u.op = OMEM},- [LABEL] = { labeldcl, symbol, .u.op = OLABEL},+} optbl[] = { /* eval parse args */+ ['A'] = { vardecl, symbol, .u.op = OAUTO},+ ['R'] = { vardecl, symbol, .u.op = OREG},+ ['G'] = { vardecl, symbol, .u.op = OMEM},+ ['X'] = { vardecl, symbol, .u.op = OMEM},+ ['Y'] = { vardecl, symbol, .u.op = OMEM},+ ['T'] = { vardecl, symbol, .u.op = OMEM},+ ['M'] = { flddecl, symbol, .u.op = OMEM},+ ['L'] = { labeldcl, symbol, .u.op = OLABEL},- [INT8] = { NULL, type, .u.arg = &int8type},- [INT16] = { NULL, type, .u.arg = &int16type},- [INT32] = { NULL, type, .u.arg = &int32type},- [INT64] = { NULL, type, .u.arg = &int64type},- [UINT8] = { NULL, type, .u.arg = &uint8type},- [UINT16] = { NULL, type, .u.arg = &uint16type},- [UINT32] = { NULL, type, .u.arg = &uint32type},- [UINT64] = { NULL, type, .u.arg = &uint64type},- [FLOAT] = { NULL, type, .u.arg = &float32type},- [DOUBLE] = { NULL, type, .u.arg = &float64type},- [LDOUBLE] = { NULL, type, .u.arg = &float80type},- [VOID] = { NULL, type, .u.arg = &voidtype},- [BOOL] = { NULL, type, .u.arg = &booltype},- [POINTER] = { NULL, type, .u.arg = &ptrtype},- [ELLIPSIS] = { NULL, type, .u.arg = &elipsistype},+ ['C'] = { NULL, type, .u.arg = &int8type},+ ['I'] = { NULL, type, .u.arg = &int16type},+ ['W'] = { NULL, type, .u.arg = &int32type},+ ['Q'] = { NULL, type, .u.arg = &int64type},+ ['K'] = { NULL, type, .u.arg = &uint8type},+ ['N'] = { NULL, type, .u.arg = &uint16type},+ ['Z'] = { NULL, type, .u.arg = &uint32type},+ ['O'] = { NULL, type, .u.arg = &uint64type},+ ['J'] = { NULL, type, .u.arg = &float32type},+ ['D'] = { NULL, type, .u.arg = &float64type},+ ['H'] = { NULL, type, .u.arg = &float80type},+ ['0'] = { NULL, type, .u.arg = &voidtype},+ ['B'] = { NULL, type, .u.arg = &booltype},+ ['P'] = { NULL, type, .u.arg = &ptrtype},+ ['E'] = { NULL, type, .u.arg = &elipsistype},- [FUNCTION] = { NULL, type, .u.arg = &funtype},- [VECTOR] = { array,composed, 0},- [UNION] = {aggregate,composed, 0},- [STRUCT] = {aggregate,composed, 0},+ ['F'] = { NULL, type, .u.arg = &funtype},+ ['V'] = { array,composed, 0},+ ['U'] = {aggregate,composed, 0},+ ['S'] = {aggregate,composed, 0},- [ONAME] = { NULL, getname, 0},- ['{'] = { beginfun, NULL, 0},- ['}'] = { endfun, NULL, 0},- ['('] = { NULL, binit, 0},- [')'] = { NULL, einit, 0},- [OEPARS] = { endpars, NULL, 0},- [OSTMT] = { stmt, NULL, 0},+ ['"'] = { NULL, getname, 0},+ ['{'] = { beginfun, NULL, 0},+ ['}'] = { endfun, NULL, 0},+ ['('] = { NULL, binit, 0},+ [')'] = { NULL, einit, 0},+ ['\\'] = { endpars, NULL, 0},+ ['\t'] = { stmt, NULL, 0},- [OCPL] = { NULL, unary, 0},- [ONEG] = { NULL, unary, 0},- [OADDR] = { NULL, unary, 0},- [OPTR] = { NULL, unary, 0},- [OCAST] = { NULL, unary, 0},- [OPAR ] = { NULL, unary, 0},+ ['~'] = { NULL, unary, .u.op = OCPL},+ ['-'] = { NULL, unary, .u.op = ONEG},+ ['\''] = { NULL, unary, .u.op = OADDR},+ ['@'] = { NULL, unary, .u.op = OPTR},+ ['g'] = { NULL, unary, .u.op = OCAST},+ ['p'] = { NULL, unary, .u.op = OPAR},- [OAND] = { NULL, binary, 0},- [OOR] = { NULL, binary, 0},- [OFIELD] = { NULL, binary, 0},- [OADD] = { NULL, binary, 0},- [OSUB] = { NULL, binary, 0},- [OMUL] = { NULL, binary, 0},- [OMOD] = { NULL, binary, 0},- [ODIV] = { NULL, binary, 0},- [OSHL] = { NULL, binary, 0},- [OSHR] = { NULL, binary, 0},- [OLT] = { NULL, binary, 0},- [OGT] = { NULL, binary, 0},- [OLE] = { NULL, binary, 0},- [OGE] = { NULL, binary, 0},- [OEQ] = { NULL, binary, 0},- [ONE] = { NULL, binary, 0},- [OBAND] = { NULL, binary, 0},- [OBOR] = { NULL, binary, 0},- [OBXOR] = { NULL, binary, 0},- [OCOMMA] = { NULL, binary, 0},+ ['a'] = { NULL, binary, .u.op = OAND},+ ['o'] = { NULL, binary, .u.op = OOR},+ ['.'] = { NULL, binary, .u.op = OFIELD},+ ['+'] = { NULL, binary, .u.op = OADD},+ ['-'] = { NULL, binary, .u.op = OSUB},+ ['*'] = { NULL, binary, .u.op = OMUL},+ ['%'] = { NULL, binary, .u.op = OMOD},+ ['/'] = { NULL, binary, .u.op = ODIV},+ ['l'] = { NULL, binary, .u.op = OSHL},+ ['r'] = { NULL, binary, .u.op = OSHR},+ ['<'] = { NULL, binary, .u.op = OLT},+ ['>'] = { NULL, binary, .u.op = OGT},+ ['['] = { NULL, binary, .u.op = OLE},+ [']'] = { NULL, binary, .u.op = OGE},+ ['='] = { NULL, binary, .u.op = OEQ},+ ['!'] = { NULL, binary, .u.op = ONE},+ ['&'] = { NULL, binary, .u.op = OBAND},+ ['|'] = { NULL, binary, .u.op = OBOR},+ ['^'] = { NULL, binary, .u.op = OBXOR},+ [','] = { NULL, binary, .u.op = OCOMMA},- [OASSIG] = { NULL, assign, 0},- [OASK] = { NULL, ternary, 0},- [OCALL] = { NULL, call, 0},+ [':'] = { NULL, assign, .u.op = OASSIG},+ ['?'] = { NULL, ternary, .u.op = OASK},+ ['c'] = { NULL, call, .u.op = OCALL},- [OCONST] = { NULL,constant, 0},+ ['#'] = { NULL,constant, .u.op = OCONST},- [OJMP] = { NULL, jump, 0},- [OBRANCH] = { NULL, jump, 0},- [ORET] = { NULL, oreturn, 0},+ ['j'] = { NULL, jump, .u.op = OJMP},+ ['y'] = { NULL, jump, .u.op = OBRANCH},+ ['h'] = { NULL, oreturn, .u.op = ORET},- [OBLOOP] = { NULL, loop, 0},- [OELOOP] = { NULL, loop, 0},+ ['b'] = { NULL, loop, .u.op = OBLOOP},+ ['e'] = { NULL, loop, .u.op = OELOOP},- [OCASE] = { NULL, jump, 0},- [OSWITCH] = { NULL, jump, 0},+ ['v'] = { NULL, jump, .u.op = OCASE},+ ['s'] = { NULL, jump, .u.op = OSWITCH},- [ODEFAULT] = { NULL,odefault, 0},- [OTABLE] = { NULL, casetbl, 0}+ ['f'] = { NULL,odefault, .u.op = ODEFAULT},+ ['t'] = { NULL, casetbl, .u.op = OTABLE}};
static int sclass, inpars, ininit, endf, lineno;
@@ -268,7 +268,7 @@
Node *ask, *colon;
Type *tp;
- tp = gettype(++token);
+ tp = gettype(token+1);
colon = newnode();
colon->op = OCOLON;
@@ -328,7 +328,7 @@
Node *np;
np = newnode();
- np->op = *token;
+ np->op = u.op;
eval(strtok(NULL, "\t\n"));
if (!empty())
np->left = pop();
@@ -341,10 +341,10 @@
Node *np, *aux;
np = newnode();
- np->op = *token;
+ np->op = u.op;
eval(strtok(NULL, "\t\n"));
- if (*token != OJMP)
+ if (u.op != OJMP)
np->left = pop();
aux = pop();
np->u.sym = aux->u.sym;
@@ -358,7 +358,7 @@
Node *np, *aux;
np = newnode();
- np->op = *token;
+ np->op = u.op;
eval(strtok(NULL, "\t\n"));
np->left = pop();
push(np);
@@ -370,7 +370,7 @@
Node *np;
np = newnode();
- np->op = *token;
+ np->op = u.op;
eval(strtok(NULL, "\t\n"));
np->left = pop();
push(np);
@@ -382,7 +382,7 @@
Node *np;
np = newnode();
- np->op = *token;
+ np->op = u.op;
push(np);
}
@@ -391,8 +391,8 @@
{Node *np = newnode();
- np->op = *token++;
- np->type = *gettype(token);
+ np->op = u.op;
+ np->type = *gettype(token+1);
np->left = pop();
np->right = NULL;
push(np);
@@ -410,8 +410,8 @@
np->right = par;
}
fun = newnode();
- fun->op = *token++;
- fun->type = *gettype(token);
+ fun->op = u.op;
+ fun->type = *gettype(token+1);
fun->left = np;
fun->right = par;
push(fun);
@@ -422,8 +422,8 @@
{Node *np = newnode();
- np->op = *token++;
- np->type = *gettype(token);
+ np->op = u.op;
+ np->type = *gettype(token+1);
np->right = pop();
np->left = pop();
push(np);
--
⑨