aboutsummaryrefslogtreecommitdiff
path: root/clr-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'clr-table.c')
-rw-r--r--clr-table.c27
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
};