Commit 6cde3702 authored by POTTIER Francois's avatar POTTIER Francois
Browse files

Removed a couple assertions in [T.register]. Cleanup.

parent 0094c751
...@@ -555,7 +555,12 @@ end = struct ...@@ -555,7 +555,12 @@ end = struct
matrix indexed by [current] and [z]. At the second level, we find sets of matrix indexed by [current] and [z]. At the second level, we find sets of
facts, where two facts are considered equal if they have the same triple of facts, where two facts are considered equal if they have the same triple of
[position], [a], and [z]. In fact, we know at this level that all facts [position], [a], and [z]. In fact, we know at this level that all facts
have the same [z] component, so only [position] and [a] are compared. *) have the same [z] component, so only [position] and [a] are compared.
Because our facts satisfy invariant 2, [z] is [any] if and only if the
state [current fact] is solid. This means that we are wasting quite a
lot of space in the matrix (for a solid state, the whole line is empty,
except for the [any] column). *)
(* The level-2 sets. *) (* The level-2 sets. *)
...@@ -577,7 +582,6 @@ end = struct ...@@ -577,7 +582,6 @@ end = struct
let table = let table =
Array.make (Lr1.n * Terminal.n) M.empty Array.make (Lr1.n * Terminal.n) M.empty
(* TEMPORARY this space is wasted for solid states *)
let index current z = let index current z =
Terminal.n * (Lr1.number current) + Terminal.t2i z Terminal.n * (Lr1.number current) + Terminal.t2i z
...@@ -587,9 +591,6 @@ end = struct ...@@ -587,9 +591,6 @@ end = struct
let register fact = let register fact =
let current = current fact in let current = current fact in
let z = fact.lookahead in let z = fact.lookahead in
assert (non_error z);
(* [z] is [any] iff [current] is solid. *)
assert ((z = any) = is_solid current);
let i = index current z in let i = index current z in
let m = table.(i) in let m = table.(i) in
(* We crucially rely on the fact that [M.add] guarantees not to (* We crucially rely on the fact that [M.add] guarantees not to
...@@ -604,9 +605,11 @@ end = struct ...@@ -604,9 +605,11 @@ end = struct
end end
let query current z f = let query current z f =
assert (z <> any); assert (not (Terminal.equal z any));
(* if [current] is solid then the facts that concern it are stored (* If the state [current] is solid then the facts that concern it are
under [any], not under [z] *) stored in the column [any], and all of them are compatible with [z].
Otherwise, they are stored in all columns except [any], and only
those stored in the column [z] are compatible with [z]. *)
let i = index current (if is_solid current then any else z) in let i = index current (if is_solid current then any else z) in
let m = table.(i) in let m = table.(i) in
M.iter f m M.iter f m
...@@ -686,7 +689,7 @@ end = struct ...@@ -686,7 +689,7 @@ end = struct
let rec query s nt a z f = let rec query s nt a z f =
assert (Terminal.real z); assert (Terminal.real z);
(* [a] can be [any] *) (* [a] can be [any] *)
if a <> any then begin if not (Terminal.equal a any) then begin
let i = index s in let i = index s in
let m = table.(i) in let m = table.(i) in
let key = pack nt a z in let key = pack nt a z in
...@@ -816,7 +819,7 @@ let consequences fact = ...@@ -816,7 +819,7 @@ let consequences fact =
[fact.lookahead], so we record that. *) [fact.lookahead], so we record that. *)
(**) (**)
if fact.lookahead <> any then begin if not (Terminal.equal fact.lookahead any) then begin
match has_reduction current fact.lookahead with match has_reduction current fact.lookahead with
| Some prod when Trie.accepts prod fact.position -> | Some prod when Trie.accepts prod fact.position ->
new_edge (source fact) (Production.nt prod) fact.word fact.lookahead new_edge (source fact) (Production.nt prod) fact.word fact.lookahead
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment