cas_parser/parser/token/
mod.rs

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