basic_parser/
basic_parser.rs

1//! Basic parser example demonstrating simple grammar parsing.
2//!
3//! This example shows how to create a parser for a simple grammar:
4//! Expr -> Ident Plus Ident
5//!
6//! Run with: cargo run --example basic_parser --package sipha-parse
7
8use sipha_core::{span::Span, token::Token as TokenStruct, traits::TokenKind};
9use sipha_parse::{helpers, parser::Parser, state::ParserState};
10use sipha_tree::{NodeArena, RawNodeId};
11
12#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
13#[allow(dead_code)]
14enum Token {
15    Ident,
16    Plus,
17    Minus,
18    Number,
19}
20
21impl TokenKind for Token {
22    fn is_trivia(&self) -> bool {
23        false
24    }
25}
26
27#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
28enum Rule {
29    Expr,
30}
31
32fn main() {
33    // Create a parser
34    let mut parser = Parser::create();
35
36    // Register a simple rule: Expr -> Ident Plus Ident
37    parser.register_rule(
38        Rule::Expr,
39        helpers::seq(vec![
40            helpers::token(Token::Ident),
41            helpers::token(Token::Plus),
42            helpers::token(Token::Ident),
43        ]),
44    );
45
46    // Create token stream: "a + b"
47    let tokens = vec![
48        TokenStruct::create(Token::Ident, Span::new(0, 1), "a", Vec::new(), Vec::new()),
49        TokenStruct::create(Token::Plus, Span::new(2, 3), "+", Vec::new(), Vec::new()),
50        TokenStruct::create(Token::Ident, Span::new(4, 5), "b", Vec::new(), Vec::new()),
51    ];
52
53    // Parse the tokens
54    let mut arena: NodeArena<Token, Rule, RawNodeId> = NodeArena::new();
55    let mut state = ParserState::new(&tokens, &mut arena, false, ());
56
57    match parser.parse_rule(Rule::Expr, &mut state) {
58        Ok(_) => {
59            println!("✓ Successfully parsed!");
60            println!("CST contains {} nodes", arena.len());
61        }
62        Err(e) => {
63            println!("✗ Parse error: {:?}", e);
64        }
65    }
66}