diff options
author | JSDurand <mmemmew@gmail.com> | 2023-06-02 22:43:33 +0800 |
---|---|---|
committer | JSDurand <mmemmew@gmail.com> | 2023-06-02 22:44:01 +0800 |
commit | 6ce44bb3bdb79e8e727ee6fc7f5c6cd7fa0bb51e (patch) | |
tree | 7e34b927d0f060b8aab4cc521a013370837c0584 /chain/src/item/genins.rs | |
parent | a6e9f5172fa72094d5c7c2fadf29ffd8cc272687 (diff) |
review of previous bug fix
Generally speaking the algorithm now works correctly and produces the
right shape of forest for the test ambiguous grammar as well. It does
not correctly perform the "reductions". It seems that I deliberately
disabled this part of the functionalities in a previous debugging
tour.
So I have to enable it again and see if it works.
Diffstat (limited to 'chain/src/item/genins.rs')
-rw-r--r-- | chain/src/item/genins.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/chain/src/item/genins.rs b/chain/src/item/genins.rs index 97d7ba9..a2bb22c 100644 --- a/chain/src/item/genins.rs +++ b/chain/src/item/genins.rs @@ -142,8 +142,6 @@ pub fn virtual_generate_fragment( Ok(result) } -// TODO: Refactor `insert_item`. - impl DefaultForest<ForestLabel<GrammarLabel>> { /// Insert an item derivation forest into a recording forest. /// @@ -252,8 +250,24 @@ impl DefaultForest<ForestLabel<GrammarLabel>> { atom.borrow(), )?; - self.print_viz(&format!("pos {pos} {tnt_string} {num} stage 1.gv")) - .unwrap(); + /// A cute little macro to produce compact representations + /// of Parents, Virtual nodes, or empty. + macro_rules! pavi_to_short_str { + ($pavi:ident) => { + match $pavi { + PaVi::Parent(node, edge) => format!("{node} {edge}"), + PaVi::Virtual(nt, t, node) => format!("{nt} {t} {node}"), + PaVi::Empty => "ε".to_string(), + } + }; + } + + self.print_viz(&format!( + "pos {pos} {tnt_string} {num} stage 1 {}, {}.gv", + pavi_to_short_str!(true_source), + pavi_to_short_str!(pavi) + )) + .unwrap(); // Ensure the last node in the PaVi is a terminal or a // non-terminal node, as an extra safety guard during @@ -296,10 +310,6 @@ impl DefaultForest<ForestLabel<GrammarLabel>> { } } - // TODO: Print each and every step. - - // TODO: Refactor this. - let is_empty_segment = pavi.is_empty(); let mut parents: Vec<Parent> = { @@ -602,6 +612,8 @@ impl DefaultForest<ForestLabel<GrammarLabel>> { Ok(result) } + // REVIEW: Is this function really correct? + /// Perform extra reductions. /// /// To be precise, this function first splones the bottom node, |