Skip to main content

shibari_grammar/
tree.rs

1mod build;
2mod builder;
3
4pub use builder::*;
5use smallvec::SmallVec;
6
7#[derive(Debug)]
8pub struct TreeMap<Output, ExtendConversion, TokenDef, TreeExtra> {
9    tokens: Vec<TokenDef>,
10    trees: Vec<Tree<Output, ExtendConversion, TreeExtra>>,
11}
12
13impl<Output, ExtendConversion, TokenDef, TreeExtra>
14    TreeMap<Output, ExtendConversion, TokenDef, TreeExtra>
15{
16    pub fn builder<TokenName, TreeName, TreeLabel>(
17    ) -> TreeMapBuilder<TokenName, TreeName, Output, ExtendConversion, TokenDef, TreeLabel, TreeExtra>
18    {
19        TreeMapBuilder::default()
20    }
21}
22
23#[derive(Debug)]
24struct Tree<Output, ExtendConversion, TreeExtra> {
25    delta: Vec<TreeDelta<Output, ExtendConversion, TreeExtra>>,
26    extends: SmallVec<[(TreePath, ExtendConversion); 1]>,
27    default: Output,
28    extra: TreeExtra,
29}
30
31#[derive(Debug)]
32struct TreePath {
33    tree: usize,
34    path: SmallVec<[usize; 2]>,
35}
36
37#[derive(Debug)]
38enum TreeDelta<Output, ExtendConversion, TreeExtra> {
39    Output(Output),
40    Goto(TreePath, Output),
41    Retry(TreePath),
42    Branch(Branch<Output, ExtendConversion, TreeExtra>),
43}
44
45#[derive(Debug)]
46struct Branch<Output, ExtendConversion, TreeExtra> {
47    out: Output,
48    tree: Tree<Output, ExtendConversion, TreeExtra>,
49}