basic_parser/
basic_parser.rs1use 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 let mut parser = Parser::create();
35
36 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 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 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}