diff options
| author | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-10 00:28:22 +0300 |
|---|---|---|
| committer | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-10 00:28:22 +0300 |
| commit | 4544ab55bc432dd567318c727de60307e700243f (patch) | |
| tree | c11bdd01040ddcc9e761baa17d7c903205120fba /clr-table.c | |
| parent | b7642dc9269b3b3525c08b170e01e0711577accf (diff) | |
shift-reduce did not work, not works (not very good) with no nonassoc
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 }; |
