1pub use petgraph::{dot::Dot, Directed, Graph};
5use petgraph::{
6 graph::{EdgeReference, NodeIndex},
7 visit::EdgeRef,
8};
9use std::collections::{BTreeMap, BTreeSet};
10use std::fmt::{Debug, Write};
11pub use streaming_iterator::StreamingIterator;
13
14pub type GSSNode<L> = (L, usize);
16
17pub type SPPFNodeIndex = usize;
19
20pub trait GrammarSymbol: Debug + PartialEq {
24 fn is_eps(&self) -> bool;
25}
26
27pub trait GrammarLabel: Debug {
31 type Symbol: GrammarSymbol;
32 fn first(&self) -> bool;
35
36 fn end(&self) -> Option<Self::Symbol>;
38}
39
40#[derive(Clone, Eq, PartialEq, Ord, PartialOrd)]
53pub enum SPPFNode<L: GrammarLabel> {
54 Dummy,
56 Symbol(L::Symbol, usize, usize, Vec<SPPFNodeIndex>),
58 Intermediate(L, usize, usize, Vec<SPPFNodeIndex>),
60 Packed(L, usize, Vec<SPPFNodeIndex>),
62}
63
64pub struct GSSState<L: Ord + Clone + GrammarLabel> {
67 pub graph: Graph<GSSNode<L>, SPPFNodeIndex, Directed>,
69 pub nodes: BTreeMap<GSSNode<L>, NodeIndex>,
71 pub sppf_nodes: Vec<SPPFNode<L>>,
73 pub initial_node_index: NodeIndex,
74 pub visited: Vec<BTreeSet<(L, NodeIndex, SPPFNodeIndex)>>,
76 pub todo: Vec<(L, NodeIndex, usize, SPPFNodeIndex)>,
78 pub pop: BTreeSet<(NodeIndex, SPPFNodeIndex)>,
80 pub current_position: usize,
82 pub current_node_index: NodeIndex,
84 pub current_sppf_node: usize,
86}
87
88impl<L: GrammarLabel> SPPFNode<L> {
89 pub fn right_extent(&self) -> usize {
91 use SPPFNode::*;
92 match self {
93 Symbol(_, _, r, _) => *r,
94 Intermediate(_, _, r, _) => *r,
95 _ => panic!("no right extent for packed and dummy"),
96 }
97 }
98
99 pub fn left_extent(&self) -> usize {
101 use SPPFNode::*;
102 match self {
103 Symbol(_, l, _, _) => *l,
104 Intermediate(_, l, _, _) => *l,
105 _ => panic!("no left extent for packed and dummy"),
106 }
107 }
108
109 pub fn children(&self) -> Option<&Vec<SPPFNodeIndex>> {
111 use SPPFNode::*;
112 match self {
113 Dummy => None,
114 Symbol(_, _, _, children) => Some(children),
115 Intermediate(_, _, _, children) => Some(children),
116 Packed(_, _, children) => Some(children),
117 }
118 }
119
120 fn children_mut(&mut self) -> Option<&mut Vec<SPPFNodeIndex>> {
121 use SPPFNode::*;
122 match self {
123 Symbol(_, _, _, children) => Some(children),
124 Intermediate(_, _, _, children) => Some(children),
125 _ => panic!("no children for packed and dummy"),
126 }
127 }
128}
129
130impl<L: Ord + Clone + GrammarLabel> GSSState<L> {
131 pub fn add(&mut self, l: L, u: NodeIndex, i: usize, w: SPPFNodeIndex) {
133 if !self.visited[i].contains(&(l.clone(), u, w)) {
134 self.visited[i].insert((l.clone(), u, w));
135 self.todo.push((l, u, i, w));
136 }
137 }
138
139 pub fn pop(&mut self, u: NodeIndex, i: usize, z: SPPFNodeIndex) {
141 if u != self.initial_node_index {
142 let (l, _k) = self.graph[u].clone();
143 self.pop.insert((u, z));
144 let edges: Vec<EdgeReference<SPPFNodeIndex>> = self.graph.edges(u).collect();
145 let edge_data: Vec<(NodeIndex, SPPFNodeIndex)> = edges
146 .iter()
147 .map(|edge| (edge.target(), *edge.weight()))
148 .collect();
149 for (v, w) in edge_data {
150 let y = self.get_node_p(l.clone(), w, z);
151 self.add(l.clone(), v, i, y);
152 }
153 }
154 }
155
156 pub fn create(&mut self, l: L, u: NodeIndex, j: usize, w: SPPFNodeIndex) -> NodeIndex {
158 let node = (l.clone(), j);
159 let v = if let Some(index) = self.nodes.get(&node) {
160 *index
161 } else {
162 let index = self.graph.add_node(node.clone());
163 self.nodes.insert(node, index);
164 index
165 };
166 if self.graph.find_edge(v, u).is_none() {
167 self.graph.add_edge(v, u, w);
168 let pop = self.pop.clone();
169 for (index, z) in pop.into_iter() {
170 if index == v {
171 let y = self.get_node_p(l.clone(), w, z);
172 let h = self.sppf_nodes[z].right_extent();
173 self.add(l.clone(), u, h, y);
174 }
175 }
176 }
177 v
178 }
179
180 pub fn get_node_t(&mut self, x: L::Symbol, i: usize) -> SPPFNodeIndex {
182 let h = if x.is_eps() { i } else { i + 1 };
183 self.find_or_create_sppf_symbol(x, i, h)
184 }
185
186 pub fn get_node_p(&mut self, l: L, w: SPPFNodeIndex, z: SPPFNodeIndex) -> SPPFNodeIndex {
188 if l.first() {
189 return z;
190 } else {
191 let node_z = &self.sppf_nodes[z];
192 let k = node_z.left_extent();
193 let i = node_z.right_extent();
194 let node_w = &self.sppf_nodes[w];
195 if SPPFNode::Dummy != *node_w {
196 let j = node_w.left_extent();
198 assert_eq!(node_w.right_extent(), k);
199 if let Some(t) = l.end() {
200 let y = self.find_or_create_sppf_symbol(t, j, i);
202 if !self.has_packed_child(y, &l, k) {
203 let len = self.sppf_nodes.len();
204 self.sppf_nodes[y].children_mut().unwrap().push(len);
205 self.sppf_nodes.push(SPPFNode::Packed(l, k, vec![w, z]));
206 }
207 y
208 } else {
209 let y = self.find_or_create_sppf_intermediate(l.clone(), j, i);
211 if !self.has_packed_child(y, &l, k) {
212 let len = self.sppf_nodes.len();
213 self.sppf_nodes[y].children_mut().unwrap().push(len);
214 self.sppf_nodes.push(SPPFNode::Packed(l, k, vec![w, z]));
215 }
216 y
217 }
218 } else {
219 if let Some(t) = l.end() {
221 let y = self.find_or_create_sppf_symbol(t, k, i);
223 if !self.has_packed_child(y, &l, k) {
224 let len = self.sppf_nodes.len();
225 self.sppf_nodes[y].children_mut().unwrap().push(len);
226 self.sppf_nodes.push(SPPFNode::Packed(l, k, vec![z]));
227 }
228 y
229 } else {
230 let y = self.find_or_create_sppf_intermediate(l.clone(), k, i);
232 if !self.has_packed_child(y, &l, k) {
233 let len = self.sppf_nodes.len();
234 self.sppf_nodes[y].children_mut().unwrap().push(len);
235 self.sppf_nodes.push(SPPFNode::Packed(l, k, vec![z]));
236 }
237 y
238 }
239 }
240 }
241 }
242
243 fn find_or_create_sppf_symbol(&mut self, s: L::Symbol, i: usize, j: usize) -> SPPFNodeIndex {
244 for (index, node) in self.sppf_nodes.iter().enumerate() {
245 if let SPPFNode::Symbol(node_s, node_i, node_j, _) = node {
246 if *node_s == s && *node_i == i && *node_j == j {
247 return index;
248 }
249 }
250 }
251 self.sppf_nodes.push(SPPFNode::Symbol(s, i, j, vec![]));
252 self.sppf_nodes.len() - 1
253 }
254
255 fn find_or_create_sppf_intermediate(&mut self, l: L, i: usize, j: usize) -> SPPFNodeIndex {
256 for (index, node) in self.sppf_nodes.iter().enumerate() {
258 if let SPPFNode::Intermediate(node_l, node_i, node_j, _) = node {
259 if *node_l == l && *node_i == i && *node_j == j {
260 return index;
261 }
262 }
263 }
264 self.sppf_nodes
265 .push(SPPFNode::Intermediate(l, i, j, vec![]));
266 self.sppf_nodes.len() - 1
267 }
268
269 pub fn collect_symbols(&self, node: SPPFNodeIndex) -> Vec<SPPFNodeIndex> {
271 use SPPFNode::*;
272 match &self.sppf_nodes[node] {
273 Dummy => vec![],
274 Symbol(_, _, _, _) => vec![node],
275 Intermediate(_, _, _, children) => children
276 .iter()
277 .map(|node| self.collect_symbols(*node))
278 .flatten()
279 .collect(),
280 Packed(_, _, children) => children
281 .iter()
282 .map(|node| self.collect_symbols(*node))
283 .flatten()
284 .collect(),
285 }
286 }
287
288 fn has_packed_child(&self, node: SPPFNodeIndex, l: &L, k: usize) -> bool {
289 if let Some(children) = self.sppf_nodes[node].children() {
291 return children.iter().any(|index| match &self.sppf_nodes[*index] {
292 SPPFNode::Packed(node_l, node_k, _) => node_l == l && *node_k == k,
293 _ => false,
294 });
295 } else {
296 unreachable!()
297 }
298 }
299
300 pub fn print_sppf_dot(&self) -> String {
302 let mut res = String::new();
303 write!(&mut res, "digraph {{\n").unwrap();
304 for (i, node) in self.sppf_nodes.iter().enumerate() {
305 let label = match node {
306 SPPFNode::Symbol(s, _, _, _) => format!("{:?}", s),
307 SPPFNode::Intermediate(_, _, _, _) => format!("I"),
308 SPPFNode::Packed(_, _, _) => format!("P"),
309 SPPFNode::Dummy => format!("D"),
310 };
311 write!(&mut res, "{} [label={:?}]\n", i, label).unwrap();
312 if let Some(children) = node.children() {
313 for child in children {
314 write!(&mut res, "{} -> {}\n", i, child).unwrap();
315 }
316 }
317 }
318 write!(&mut res, "}}").unwrap();
319 res
320 }
321
322 pub fn print_gss_dot(&self) -> String {
324 format!("{:?}", Dot::with_config(&self.graph, &[]))
325 }
326}