1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#[macro_export]
macro_rules! expected_token {
($input: expr, $actual:expr, $expected:expr) => {{
use $crate::parser::error::{InternalError, ParserErrorKind};
Err(nom::Err::Error(InternalError::from_kind(
$input,
ParserErrorKind::ExpectedToken {
actual: $actual.clone(),
expected: $expected,
},
)))
}};
}
#[macro_export]
macro_rules! token {
($expected_variant: ident($enm:ident::$variant:ident)) => {{
use $crate::parser::error::{InternalError, ParserErrorKind};
use $crate::parser::lexer::$enm;
use $crate::parser::lexer::Token;
move |input: ParserInput<'a>| match $crate::parser::split_first_token(input) {
None => Err(nom::Err::Error(InternalError::from_kind(
input,
ParserErrorKind::UnexpectedEOF("something else"),
))),
Some((Token::$expected_variant($enm::$variant), remainder)) => Ok((remainder, ())),
Some((other_token, _)) => {
$crate::expected_token!(
input,
other_token,
stringify!($expected_variant).to_owned()
)
}
}
}};
($expected_variant: ident($contents: ident)) => {{
use $crate::parser::error::{InternalError, ParserErrorKind};
use $crate::parser::lexer::Token;
move |input: ParserInput<'a>| match $crate::parser::split_first_token(input) {
None => Err(nom::Err::Error(InternalError::from_kind(
input,
ParserErrorKind::UnexpectedEOF("something else"),
))),
Some((Token::$expected_variant($contents), remainder)) => {
Ok((remainder, $contents.clone()))
}
Some((other_token, _)) => {
$crate::expected_token!(
input,
other_token,
stringify!($expected_variant).to_owned()
)
}
}
}};
($expected_variant: ident) => {{
use $crate::parser::error::{InternalError, ParserErrorKind};
use $crate::parser::lexer::Token;
move |input: ParserInput<'a>| match $crate::parser::split_first_token(input) {
None => Err(nom::Err::Error(InternalError::from_kind(
input,
ParserErrorKind::UnexpectedEOF("something else"),
))),
Some((Token::$expected_variant, remainder)) => Ok((remainder, ())),
Some((other_token, _)) => {
$crate::expected_token!(
input,
other_token,
stringify!($expected_variant).to_owned()
)
}
}
}};
}
#[macro_export]
macro_rules! unexpected_eof {
($input: expr) => {{
use $crate::parser::error::{InternalError, ParserErrorKind};
Err(nom::Err::Error(InternalError::from_kind(
$input,
ParserErrorKind::UnexpectedEOF("something else"),
)))
}};
}
#[macro_export]
macro_rules! make_test {
($name: ident, $parser: ident, $input: expr, $expected: expr) => {
#[test]
fn $name() {
let input = ::nom_locate::LocatedSpan::new($input);
let tokens = lex(input).unwrap();
let (remainder, parsed) = $parser(&tokens).unwrap();
assert_eq!(remainder.len(), 0, "tokens left over");
assert_eq!(parsed, $expected);
}
};
}