aboutsummaryrefslogtreecommitdiff
path: root/clr-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'clr-table.c')
-rw-r--r--clr-table.c15
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];