cfg_grammar/history/
node.rs1use std::num::NonZeroUsize;
5
6use crate::Symbol;
7
8pub type HistoryId = NonZeroUsize;
9
10#[derive(Clone)]
11pub enum HistoryNode {
12    Linked {
13        prev: HistoryId,
14        node: LinkedHistoryNode,
15    },
16    Root(RootHistoryNode),
17}
18
19#[derive(Clone)]
20pub enum LinkedHistoryNode {
21    Rhs {
22        rhs: Vec<Symbol>,
23    },
24    Binarize {
25        depth: u32,
26    },
27    EliminateNulling {
28        rhs0: Symbol,
29        rhs1: Option<Symbol>,
30        which: BinarizedRhsSubset,
31    },
32    AssignPrecedence {
33        looseness: u32,
34    },
35    RewriteSequence {
36        top: bool,
37        rhs: Symbol,
38        sep: Option<Symbol>,
39    },
40    Weight {
41        weight: f64,
42    },
43    Distances {
44        events: Vec<u32>,
45    },
46}
47
48#[derive(Clone, Copy)]
49pub enum RootHistoryNode {
50    NoOp,
51    Rule { lhs: Symbol },
52    Origin { origin: usize },
53}
54
55impl From<RootHistoryNode> for HistoryNode {
56    fn from(value: RootHistoryNode) -> Self {
57        HistoryNode::Root(value)
58    }
59}
60
61pub struct HistoryNodeRhs {
62    pub prev: HistoryId,
63    pub rhs: Vec<Symbol>,
64}
65
66#[derive(Clone, Copy)]
67pub struct HistoryNodeBinarize {
68    pub prev: HistoryId,
69    pub depth: u32,
70}
71
72#[derive(Clone, Copy)]
73pub struct HistoryNodeWeight {
74    pub prev: HistoryId,
75    pub weight: f64,
76}
77
78#[derive(Clone, Copy)]
79pub struct HistoryNodeEliminateNulling {
80    pub prev: HistoryId,
81    pub rhs0: Symbol,
82    pub rhs1: Option<Symbol>,
83    pub which: BinarizedRhsSubset,
84}
85
86#[derive(Clone, Copy)]
87pub struct HistoryNodeAssignPrecedence {
88    pub prev: HistoryId,
89    pub looseness: u32,
90}
91
92#[derive(Clone, Copy)]
93pub struct HistoryNodeRewriteSequence {
94    pub prev: HistoryId,
95    pub top: bool,
96    pub rhs: Symbol,
97    pub sep: Option<Symbol>,
98}
99
100impl From<HistoryNodeRhs> for HistoryNode {
101    fn from(value: HistoryNodeRhs) -> Self {
102        HistoryNode::Linked {
103            prev: value.prev,
104            node: LinkedHistoryNode::Rhs { rhs: value.rhs },
105        }
106    }
107}
108
109impl From<HistoryNodeBinarize> for HistoryNode {
110    fn from(value: HistoryNodeBinarize) -> Self {
111        HistoryNode::Linked {
112            prev: value.prev,
113            node: LinkedHistoryNode::Binarize { depth: value.depth },
114        }
115    }
116}
117
118impl From<HistoryNodeWeight> for HistoryNode {
119    fn from(value: HistoryNodeWeight) -> Self {
120        HistoryNode::Linked {
121            prev: value.prev,
122            node: LinkedHistoryNode::Weight {
123                weight: value.weight,
124            },
125        }
126    }
127}
128
129impl From<HistoryNodeEliminateNulling> for HistoryNode {
130    fn from(value: HistoryNodeEliminateNulling) -> Self {
131        HistoryNode::Linked {
132            prev: value.prev,
133            node: LinkedHistoryNode::EliminateNulling {
134                rhs0: value.rhs0,
135                rhs1: value.rhs1,
136                which: value.which,
137            },
138        }
139    }
140}
141
142impl From<HistoryNodeAssignPrecedence> for HistoryNode {
143    fn from(value: HistoryNodeAssignPrecedence) -> Self {
144        HistoryNode::Linked {
145            prev: value.prev,
146            node: LinkedHistoryNode::AssignPrecedence {
147                looseness: value.looseness,
148            },
149        }
150    }
151}
152
153impl From<HistoryNodeRewriteSequence> for HistoryNode {
154    fn from(value: HistoryNodeRewriteSequence) -> Self {
155        HistoryNode::Linked {
156            prev: value.prev,
157            node: LinkedHistoryNode::RewriteSequence {
158                top: value.top,
159                rhs: value.rhs,
160                sep: value.sep,
161            },
162        }
163    }
164}
165
166#[derive(Clone, Copy, Eq, PartialEq)]
168pub enum BinarizedRhsSubset {
169    Left,
171    Right,
173    All,
175}