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