grammar_builder/
grammar_builder.rs

1//! Grammar builder example demonstrating the fluent builder API.
2//!
3//! This example shows how to use GrammarRuleBuilder to construct
4//! grammar rules in a more ergonomic way.
5//!
6//! Run with: cargo run --example grammar_builder
7
8use 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    // Build a delimited expression using helpers
46    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    // Build a separated list of arguments
56    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    // Build a function call
68    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    // Build a simple expression rule
79    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}