diff options
Diffstat (limited to 'clr-table.c')
-rw-r--r-- | clr-table.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/clr-table.c b/clr-table.c index 8f09ef1..7b7e057 100644 --- a/clr-table.c +++ b/clr-table.c @@ -259,10 +259,14 @@ enum symbol { EP, E, L, R, SYMBOLS_END, #else - SC, SD, + IF, ELSE, N, PLUS, TIMES, EQUAL, END_INPUT, - EP, E, C, + EP, E, STMT, SYMBOLS_END + // SC, SD, + // END_INPUT, + // EP, E, C, + // SYMBOLS_END #endif }; @@ -272,7 +276,8 @@ IMPLEMENT_FUNCPTR(int, symbol_is_terminal, (symbol s)) { return s < EP; } IMPLEMENT_FUNCPTR(int, symbol_is_input_end, (symbol s)) { return s == END_INPUT; } // implement grammar.h -#define PROD(LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), 0} +// #define PROD(LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), 0} +#define PROD(P, LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), P} static struct production _grammar[] = { #if (CHOOSE_GRAMMAR == 0) PROD(EP, ->, E, END_INPUT), @@ -282,10 +287,18 @@ static struct production _grammar[] = { PROD(L, -->, ID), PROD(R, -->, L), #else - PROD(EP, ->, E, END_INPUT), - PROD(E, -->, C, C), - PROD(C, -->, SC, C), - PROD(C, -->, SD), + // PROD(EP, ->, E, END_INPUT), + // PROD(E, -->, C, C), + // PROD(C, -->, SC, C), + // PROD(C, -->, SD), + PROD(0, EP, ->, E, END_INPUT), + PROD(0, E, -->, STMT), + PROD(0, STMT, -->, IF, STMT), + PROD(0, STMT, -->, IF, STMT, ELSE, STMT), + PROD(0, STMT, -->, N), + PROD((2 << 2) | (PRECEDENCE_LEFT_ASSOC), STMT, -->, STMT, PLUS, STMT), + PROD((1 << 2) | (PRECEDENCE_NO_ASSOC), STMT, -->, STMT, EQUAL, STMT), + PROD((3 << 2) | (PRECEDENCE_LEFT_ASSOC), STMT, -->, STMT, TIMES, STMT), #endif }; |