diff options
author | kartofen <mladenovnasko0@gmail.com> | 2025-07-17 01:27:05 +0300 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2025-07-17 01:27:05 +0300 |
commit | 7ccd9286bafbd01fbda67c2f234998c2e591ed2a (patch) | |
tree | 01448f5b8201ce92f684737b188599e3f227064b /clr-table.c | |
parent | 8ea8bd7e41c48be9635c29fb928fe9decc4eb112 (diff) |
Diffstat (limited to 'clr-table.c')
-rw-r--r-- | clr-table.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/clr-table.c b/clr-table.c index 7b7e057..af39441 100644 --- a/clr-table.c +++ b/clr-table.c @@ -15,6 +15,7 @@ extern void *xcalloc(size_t n, size_t size); // Requirements #include "parts/symbol.h" #include "parts/grammar.h" +#include "parts/precedence.h" #include "parts/util-tables.h" // Implements @@ -259,14 +260,14 @@ enum symbol { EP, E, L, R, SYMBOLS_END, #else - IF, ELSE, N, PLUS, TIMES, EQUAL, - END_INPUT, - EP, E, STMT, - SYMBOLS_END // SC, SD, // END_INPUT, // EP, E, C, // SYMBOLS_END + IF, ELSE, N, PLUS, TIMES, EQUAL, + END_INPUT, + EP, E, STMT, + SYMBOLS_END #endif }; @@ -276,8 +277,7 @@ 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(P, LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol), P} +#define PROD(LHS, _, ...) {LHS, (symbol[]){__VA_ARGS__}, sizeof((symbol[]){__VA_ARGS__})/sizeof(symbol)} static struct production _grammar[] = { #if (CHOOSE_GRAMMAR == 0) PROD(EP, ->, E, END_INPUT), @@ -291,20 +291,34 @@ static struct production _grammar[] = { // 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), + PROD(EP, ->, E, END_INPUT), + PROD(E, -->, STMT), + PROD(STMT, -->, IF, STMT), + PROD(STMT, -->, IF, STMT, ELSE, STMT), + PROD(STMT, -->, N), + PROD(STMT, -->, STMT, PLUS, STMT), + PROD(STMT, -->, STMT, EQUAL, STMT), + PROD(STMT, -->, STMT, TIMES, STMT), #endif }; struct production *grammar = _grammar; size_t total_productions = sizeof(_grammar)/sizeof(*_grammar); +// implement precedence.h +#define c(...) __builtin_constant_p(__VA_ARGS__) +int *precedence_symbol = (int[]){ + [PLUS] = PRECEDENCE_SET(2, PRECEDENCE_LEFT_ASSOC), + [EQUAL] = PRECEDENCE_SET(1, PRECEDENCE_LEFT_ASSOC), + [TIMES] = PRECEDENCE_SET(3, PRECEDENCE_LEFT_ASSOC), +}; + +int *precedence_production = (int[]){ + [5] = PRECEDENCE_SET(2, PRECEDENCE_LEFT_ASSOC), + [6] = PRECEDENCE_SET(1, PRECEDENCE_LEFT_ASSOC), + [7] = PRECEDENCE_SET(3, PRECEDENCE_LEFT_ASSOC), +}; + // implement util-tables.h #include "util-tables.c" |