From 34357640c0676f33ad13aac1fe28effc6f6e47c7 Mon Sep 17 00:00:00 2001 From: kartofen Date: Sun, 20 Jul 2025 01:32:24 +0300 Subject: start of grammar parsing --- clr-table.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'clr-table.c') diff --git a/clr-table.c b/clr-table.c index af39441..764bbcc 100644 --- a/clr-table.c +++ b/clr-table.c @@ -3,8 +3,6 @@ #include #include -// TODO: handle conflicts (itemset_insert returns 2 on table problem) - #ifndef XCALLOC_IMPLEMENTED #define XCALLOC_IMPLEMENTED void *xcalloc(size_t n, size_t size) { void *addr = calloc(n, size); return addr ? addr : (exit(1), NULL); } @@ -44,7 +42,7 @@ static int item_eq(struct item *i1, struct item *i2) { return (i1->dot == i2->do static int item_core_eq(struct item *i1, struct item *i2) { return (i1->dot == i2->dot && i1->prod_idx == i2->prod_idx) ? 1 : 0; } #endif -#define SEEN_SETS_CAP 64 +#define SEEN_SETS_CAP 256 static struct { struct item *items; size_t nitems; @@ -72,7 +70,7 @@ static size_t itemset_handle(struct item *set, size_t nset) #endif // 1. is set in seen_sets - for(size_t i = 0; i < nseen_sets; i++) { + for(size_t i = 0; i < nseen_sets; i++) if(seen_sets[i].nitems == nset) { int _seen = 0; for(size_t j = 0; j < nset; j++) { @@ -85,6 +83,7 @@ static size_t itemset_handle(struct item *set, size_t nset) } #ifdef _LAZY_LALR + for(size_t i = 0; i < nseen_sets; i++) { int _same_core = 0; for(size_t j = 0; j < nset; j++) { _same_core = 0; @@ -92,9 +91,9 @@ static size_t itemset_handle(struct item *set, size_t nset) if(item_core_eq(&seen_sets[i].items[k], &set[j])) _same_core = 1; if(!_same_core) break; } - if(_same_core) { (use_state != SIZE_MAX) && (exit(15), 1); use_state = seen_sets[i].state; } -#endif + if(_same_core) { use_state = seen_sets[i].state; break; } } +#endif // 2. add set to seen_sets if(nseen_sets >= SEEN_SETS_CAP) { @@ -126,8 +125,8 @@ static size_t itemset_handle(struct item *set, size_t nset) return new_state; } -#define CLOSURE_SET_CAP 64 -#define GOTO_SET_CAP 32 +#define CLOSURE_SET_CAP 128 +#define GOTO_SET_CAP 128 static int itemset_insert(size_t state, struct item *initial_set, size_t ninitial) { struct item closure_set[CLOSURE_SET_CAP]; -- cgit v1.2.3