summaryrefslogtreecommitdiff
path: root/src/lalr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lalr.c')
-rw-r--r--src/lalr.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/lalr.c b/src/lalr.c
index b87cebb5..275c6ab7 100644
--- a/src/lalr.c
+++ b/src/lalr.c
@@ -52,8 +52,22 @@ typedef struct goto_list_s
} goto_list_t;
-rule_t **LArule = NULL;
-bitsetv LA = NULL;
+/* LARULE is a vector which records the rules that need lookahead in
+ various states. The elements of LARULE that apply to state S are
+ those from LOOKAHEADS[S] through LOOKAHEADS[S+1]-1.
+
+ If LR is the length of LArule, then a number from 0 to LR-1 can
+ specify both a rule and a state where the rule might be applied.
+ */
+
+static rule_t **LArule = NULL;
+
+/* LA is a LR by NTOKENS matrix of bits. LA[l, i] is 1 if the rule
+ LArule[l] is applicable in the appropriate state when the next
+ token is symbol i. If LA[l, i] and LA[l, j] are both 1 for i != j,
+ it is a conflict. */
+
+static bitsetv LA = NULL;
size_t nLA;
@@ -460,3 +474,17 @@ lalr (void)
if (trace_flag & trace_sets)
lookaheads_print (stderr);
}
+
+
+void
+lalr_free (void)
+{
+ state_number_t s;
+ for (s = 0; s < nstates; ++s)
+ {
+ states[s]->lookaheads = NULL;
+ states[s]->lookaheads_rule = NULL;
+ }
+ bitsetv_free (LA);
+ free (LArule);
+}