trident/syntax/grammar/
dsl.rs1use 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}