ref: b1f76286f75c39cdf972ebe1884702da9196db8e
parent: d5735ceb7f5deac28bda7a2daf2e02efa15287c3
author: Roberto E. Vargas Caballero <[email protected]>
date: Wed Mar 19 14:20:36 EDT 2014
Simplify the expression file It is better for the refactoring proccess.
--- a/expr.c
+++ b/expr.c
@@ -39,311 +39,6 @@
return np;
}
-static struct node *
-postfix(void)
-{
- register struct node *np1, *np2;
-
- np1 = primary(); /* TODO: fix ( case */
- for (;;) {
- register unsigned char op;
- switch (yytoken) {
- case '[':
- next();
- np2 = expr();
- expect(']');
- op = OARY;
- goto node_2_childs; /* TODO: better names */
- case '(':
- next();
- np2 = expr();
- expect(')');
- op = OCALL;
- goto node_2_childs;
- case '.': op = OFIELD; goto expect_iden;
- case INDIR: op = OPTR; goto expect_iden;
- case INC: op = OPOSTINC; goto next;
- case DEC: op = OPOSTDEC; goto next;
- default: return np1;
- }
- expect_iden:
- next();
- expect(IDEN);
- /* TODO: Do something interesting */
- node_2_childs:
- np1 = node(op, np1, np2);
- continue;
- next:
- np1 = node(op, np1, NULL);
- next();
- continue;
- }
-}
-
-static struct node *cast(void);
-
-static struct node *
-unary(void)
-{
- register unsigned char op;
-
- switch (yytoken) {
- case SIZEOF: /* TODO: Implement sizeof */
- next();
- if (accept('(')) {
- switch (yytoken) {
- case TQUALIFIER: case TYPE:
- context(typename);
- break;
- default:
- expr();
- break;
- }
- expect(')');
- } else {
- unary();
- }
- return NULL; /* TODO: return something interesting here */
- case INC: op = OPREINC; goto call_unary;
- case DEC: op = OPREDEC; goto call_unary;
- case '&': op = OADDR; goto call_cast;
- case '*': op = OINDIR; goto call_cast;
- case '-': op = OMINUS; goto call_cast;
- case '+': op = OPLUS; goto call_cast;
- case '~': op = OCPL; goto call_cast;
- case '!': op = ONEG; goto call_cast;
- default: return postfix();
- }
-
-call_cast:
- next();
- return node(op, cast(), NULL);
-
-call_unary:
- next();
- return node(op, unary(), NULL);
-}
-
-static struct node *
-cast(void)
-{
-repeat: if (yytoken == '(') {
- switch (ahead()) {
- case TQUALIFIER: case TYPE:
- next();
- /* TODO: type_name should return a np*/
- context(typename);
- expect(')');
- goto repeat;
- default:
- break;
- }
- }
- return unary();
-}
-
-static struct node *
-mul(void)
-{
- register struct node *np;
- register unsigned char op;
-
- np = cast();
- for (;;) {
- switch (yytoken) {
- case '*': op = OMUL; break;
- case '/': op = ODIV; break;
- case '%': op = OMOD; break;
- default: return np;
- }
- next();
- np = node(op, np, cast());
- }
-}
-
-static struct node *
-add(void)
-{
- register unsigned char op;
- register struct node *np;
-
- np = mul();
- for (;;) {
- switch (yytoken) {
- case '+': op = OADD; break;
- case '-': op = OSUB; break;
- default: return np;
- }
- next();
- np = node(op, np, mul());
- }
-}
-
-static struct node *
-shift(void)
-{
- register unsigned char op;
- register struct node *np;
-
- np = add();
- for (;;) {
- switch (yytoken) {
- case SHL: op = OSHL; break;
- case SHR: op = OSHR; break;
- default: return np;
- }
- next();
- np = node(op, np, add());
- }
-}
-
-static struct node *
-relational(void)
-{
- register unsigned char op;
- register struct node *np;
-
- np = shift();
- for (;;) {
- switch (yytoken) {
- case '<': op = OLT; break;
- case '>': op = OGT; break;
- case GE: op = OGE; break;
- case LE: op = OLE; break;
- default: return np;
- }
- next();
- np = node(op, np, shift());
- }
-}
-
-static struct node *
-eq(void)
-{
- register unsigned char op;
- register struct node *np;
-
- np = relational();
- for (;;) {
- switch (yytoken) {
- case EQ: op = OEQ; break;
- case NE: op = ONE; break;
- default: return np;
- }
- next();
- np = node(op, np, relational());
- }
-}
-
-static struct node *
-bit_and(void)
-{
- register struct node *np;
-
- np = eq();
- while (yytoken == '&') {
- next();
- np = node(OBAND, np, eq());
- }
- return np;
-}
-
-static struct node *
-bit_xor(void)
-{
- register struct node *np;
-
- np = bit_and();
- while (yytoken == '^') {
- next();
- np = node(OBXOR, np, bit_and());
- }
- return np;
-}
-
-static struct node *
-bit_or(void)
-{
- register struct node *np;
-
- np = bit_xor();
- while (yytoken == '|') {
- next();
- np = node(OBOR, np, bit_xor());
- }
- return np;
-}
-
-static struct node *
-and(void)
-{
- register struct node *np;
-
- np = bit_or();
- while (yytoken == AND) {
- next();
- np = node(OAND, np, bit_or());
- }
- return np;
-}
-
-static struct node *
-or(void)
-{
- register struct node *np;
-
- np = and();
- while (yytoken == OR) {
- next();
- np = node(OOR, np, and());
- }
- return np;
-}
-
-static struct node *
-cond(void)
-{
- register struct node *np, *aux;
-
- np = or();
- while (yytoken == '?') {
- aux = expr();
- expect(':');
- np = node(OTERN, np,
- node(O2EXP, aux, or()));
- }
- return np;
-}
-
-static struct node *
-assign(void)
-{
- register struct node *np = cond();
-
- for (;;) {
- register unsigned 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();
- np = node(op, np, assign());
- }
-return_np:
- return np;
-}
-
struct node *
expr(void)
{
@@ -350,7 +45,7 @@
register struct node *np;
do
- np = assign();
+ np = primary();
while (yytoken == ',');
return np;