From 81854107bcf0b4480cfb11e8af7fec6894240c0c Mon Sep 17 00:00:00 2001 From: JSDurand Date: Tue, 1 Aug 2023 11:47:44 +0800 Subject: Fix some bugs Some bugs are fixed: 1. If a non-terminal expansion can be reduced immediately, previously an extra node would be created that had no parents. Now this strange behaviour is corrected. 2. When performing reductions, a leaf non-terminal node would previously be regarded as completed. Now we will first try to complete that node, and then determine if the completion is successful, and finally determine the completedness according to the result. Of course some more tests are still pending, before I can confirm that no more bugs lurk around. --- chain/src/item/genins.rs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'chain/src/item/genins.rs') diff --git a/chain/src/item/genins.rs b/chain/src/item/genins.rs index bad0cfd..d5fb678 100644 --- a/chain/src/item/genins.rs +++ b/chain/src/item/genins.rs @@ -378,6 +378,8 @@ impl DefaultForest> { let reduced = self.reduction(nth_child, pos, ter, atom.borrow(), false)?; + // dbg!(reduced, nth_child, self.is_empty_node(reduced)?); + if reduced != nth_child && !self.is_empty_node(reduced)? { parents.clear(); parents.extend(self.parents_of(reduced)?); @@ -514,6 +516,7 @@ impl DefaultForest> { if stack.is_empty() { dbg!( + is_empty_segment, label, atom_child, parents, @@ -698,12 +701,13 @@ impl DefaultForest> { Ok(nth_child) } } - PaVi::Virtual(nt, t, mut node) => { - let node_label_start = self + PaVi::Virtual(nt, t, node) => { + let node_label = self .vertex_label(node)? .ok_or(Error::NodeNoLabel(node))? - .label() - .start(); + .label(); + + let node_label_start = node_label.start(); let reduction_fragment = atom.generate_virtual_frags(nt, t, None); @@ -719,9 +723,16 @@ impl DefaultForest> { for frag in reduction_fragment.into_iter().flatten() { let mut frag = frag.clone(); - frag.set_pos(atom, node_label_start, true)?; + let _root_closed_p = frag.set_pos(atom, node_label_start, true)?; + + // NOTE: If the root is closed, planting it might + // affect the original node, but we shall not deal + // with this phenomenon here. + // + // Instead, we will ignore the extra node at later + // stages. - node = self.plant_at_start(node, frag)?; + self.plant_at_start(node, frag)?; } Ok(node) -- cgit v1.2.3-18-g5258