Skip to main content

trident/syntax/grammar/
dsl.rs

1use super::Node;
2
3pub fn seq(nodes: Vec<Node>) -> Node {
4    Node::Seq(nodes)
5}
6
7pub fn choice(nodes: Vec<Node>) -> Node {
8    Node::Choice(nodes)
9}
10
11pub fn repeat(node: Node) -> Node {
12    Node::Repeat(Box::new(node))
13}
14
15pub fn repeat1(node: Node) -> Node {
16    Node::Repeat1(Box::new(node))
17}
18
19pub fn str_(s: &'static str) -> Node {
20    Node::Str(s)
21}
22
23pub fn sym(s: &'static str) -> Node {
24    Node::Symbol(s)
25}
26
27pub fn pattern(p: &'static str) -> Node {
28    Node::Pattern(p)
29}
30
31pub fn field(name: &'static str, content: Node) -> Node {
32    Node::Field {
33        name,
34        content: Box::new(content),
35    }
36}
37
38pub fn prec(value: i32, content: Node) -> Node {
39    Node::Prec {
40        value,
41        content: Box::new(content),
42    }
43}
44
45pub fn prec_left(value: i32, content: Node) -> Node {
46    Node::PrecLeft {
47        value,
48        content: Box::new(content),
49    }
50}
51
52pub fn alias(content: Node, value: &'static str, named: bool) -> Node {
53    Node::Alias {
54        content: Box::new(content),
55        value,
56        named,
57    }
58}
59
60pub fn token(content: Node) -> Node {
61    Node::Token(Box::new(content))
62}
63
64pub fn optional(node: Node) -> Node {
65    choice(vec![node, Node::Blank])
66}
67
68pub fn comma_sep1(rule: &'static str) -> Node {
69    seq(vec![sym(rule), repeat(seq(vec![str_(","), sym(rule)]))])
70}
71
72pub fn comma_sep1_inline(node: Node, repeat_node: Node) -> Node {
73    seq(vec![node, repeat(seq(vec![str_(","), repeat_node]))])
74}