cas_parser/parser/token/
mod.rs

1pub mod op;
2pub mod pair;
3
4use cas_error::Error;
5use crate::{
6    parser::{error::UnexpectedToken, garbage::Garbage, Parser, Parse},
7    tokenizer::TokenKind,
8};
9use std::ops::Range;
10
11/// Generates a unit struct for each token kind, as well as a simple [`Parse`] implementation for
12/// each token kind. This enables the parser to use and request token kinds as a type, which is
13/// much more ergonomic than using a string.
14macro_rules! token_kinds {
15    ($($name:ident)*) => {
16        $(
17            #[derive(Clone, Debug, PartialEq)]
18            pub struct $name<'source> {
19                pub lexeme: &'source str,
20                pub span: Range<usize>,
21            }
22
23            impl<'source> Parse<'source> for $name<'source> {
24                fn std_parse(
25                    input: &mut Parser<'source>,
26                    _: &mut Vec<Error>
27                ) -> Result<Self, Vec<Error>> {
28                    let token = input.next_token().map_err(|e| vec![e])?;
29
30                    if token.kind == TokenKind::$name {
31                        Ok(Self {
32                            lexeme: token.lexeme,
33                            span: token.span,
34                        })
35                    } else {
36                        Err(vec![Error::new(vec![token.span], UnexpectedToken {
37                            expected: &[TokenKind::$name],
38                            found: token.kind,
39                        })])
40                    }
41                }
42            }
43
44            impl<'source> Garbage for $name<'source> {
45                fn garbage() -> Self {
46                    Self { lexeme: "", span: 0..0 }
47                }
48            }
49        )*
50    };
51}
52
53token_kinds!(
54    NewLine
55    Whitespace
56    Eq
57    NotEq
58    ApproxEq
59    ApproxNotEq
60    Add
61    Sub
62    Mul
63    Div
64    Mod
65    Exp
66    Greater
67    GreaterEq
68    Less
69    LessEq
70    Not
71    Factorial
72    And
73    Or
74    BitAnd
75    BitOr
76    BitNot
77    BitRight
78    BitLeft
79    Assign
80    AddAssign
81    SubAssign
82    MulAssign
83    DivAssign
84    ModAssign
85    ExpAssign
86    AndAssign
87    OrAssign
88    BitAndAssign
89    BitOrAssign
90    BitRightAssign
91    BitLeftAssign
92    Bin
93    Oct
94    Hex
95    Name
96    Keyword
97    Comma
98    OpenParen
99    CloseParen
100    OpenCurly
101    CloseCurly
102    OpenSquare
103    CloseSquare
104    Quote
105    Semicolon
106    Int
107    Boolean
108    Dot
109    RangeHalfOpen
110    RangeClosed
111    Symbol
112);