aboutsummaryrefslogtreecommitdiff
path: root/clr-table.c
diff options
context:
space:
mode:
authorkartofen <mladenovnasko0@gmail.com>2025-07-17 01:27:05 +0300
committerkartofen <mladenovnasko0@gmail.com>2025-07-17 01:27:05 +0300
commit7ccd9286bafbd01fbda67c2f234998c2e591ed2a (patch)
tree01448f5b8201ce92f684737b188599e3f227064b /clr-table.c
parent8ea8bd7e41c48be9635c29fb928fe9decc4eb112 (diff)
ok precedenceHEADmaster
Diffstat (limited to 'clr-table.c')
-rw-r--r--clr-table.c42
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"