grammar_builder/
grammar_builder.rs1use sipha_parse::{helpers, GrammarRuleBuilder, Parser};
9
10#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
11#[allow(dead_code)]
12enum Token {
13 Ident,
14 Number,
15 Plus,
16 Minus,
17 Star,
18 Slash,
19 LParen,
20 RParen,
21 Comma,
22 Semicolon,
23 Whitespace,
24}
25
26impl sipha_core::traits::TokenKind for Token {
27 fn is_trivia(&self) -> bool {
28 matches!(self, Token::Whitespace)
29 }
30}
31
32#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
33#[allow(dead_code)]
34enum Rule {
35 Expr,
36 Term,
37 Factor,
38 FunctionCall,
39 ArgList,
40}
41
42fn main() {
43 let mut parser = Parser::create();
44
45 parser.register_rule(
47 Rule::Factor,
48 helpers::seq(vec![
49 helpers::token(Token::LParen),
50 helpers::rule(Rule::Expr),
51 helpers::token(Token::RParen),
52 ]),
53 );
54
55 parser.register_rule(
57 Rule::ArgList,
58 helpers::seq(vec![
59 helpers::rule(Rule::Expr),
60 helpers::many(helpers::seq(vec![
61 helpers::token(Token::Comma),
62 helpers::rule(Rule::Expr),
63 ])),
64 ]),
65 );
66
67 parser.register_rule(
69 Rule::FunctionCall,
70 GrammarRuleBuilder::new()
71 .token(Token::Ident)
72 .token(Token::LParen)
73 .rule(Rule::ArgList)
74 .token(Token::RParen)
75 .build_sequence(),
76 );
77
78 parser.register_rule(
80 Rule::Expr,
81 GrammarRuleBuilder::new()
82 .token(Token::Ident)
83 .token(Token::Semicolon)
84 .build_sequence(),
85 );
86
87 println!("Grammar built successfully!");
88 println!("Registered {} rules", 4);
89}