diff options
| author | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-20 01:32:24 +0300 |
|---|---|---|
| committer | kartofen <kartofen.mail.0@protonmail.com> | 2025-07-20 01:32:24 +0300 |
| commit | 34357640c0676f33ad13aac1fe28effc6f6e47c7 (patch) | |
| tree | d656ee61da7d7a0b133aa57311266653ef100569 /clr-table.c | |
| parent | 174e9b35ce3b6e99e500907f1bb24c6f31f481bf (diff) | |
start of grammar parsing
Diffstat (limited to 'clr-table.c')
| -rw-r--r-- | clr-table.c | 15 |
1 files changed, 7 insertions, 8 deletions
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 <stdint.h> #include <setjmp.h> -// 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]; |
