cas_parser/parser/token/
mod.rs1pub 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
10macro_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);