scryer_prolog/parser/
macros.rs

1#[macro_export]
2macro_rules! char_class {
3    ($c: expr, [$head:expr]) => ($c == $head);
4    ($c: expr, [$head:expr $(, $cs:expr)+]) => ($c == $head || $crate::char_class!($c, [$($cs),*]));
5}
6
7#[macro_export]
8macro_rules! alpha_char {
9    ($c: expr) => {
10        (!$c.is_numeric()
11            && !$c.is_whitespace()
12            && !$c.is_control()
13            && !$crate::graphic_token_char!($c)
14            && !$crate::layout_char!($c)
15            && !$crate::meta_char!($c)
16            && !$crate::solo_char!($c))
17            || $c == '_'
18    };
19}
20
21#[macro_export]
22macro_rules! alpha_numeric_char {
23    ($c: expr) => {
24        $crate::alpha_char!($c) || $c.is_numeric()
25    };
26}
27
28#[macro_export]
29macro_rules! backslash_char {
30    ($c: expr) => {
31        $c == '\\'
32    };
33}
34
35#[macro_export]
36macro_rules! back_quote_char {
37    ($c: expr) => {
38        $c == '`'
39    };
40}
41
42#[macro_export]
43macro_rules! octet_char {
44    ($c: expr) => {
45        ('\u{0000}'..='\u{00FF}').contains(&$c)
46    };
47}
48
49#[macro_export]
50macro_rules! capital_letter_char {
51    ($c: expr) => {
52        $c.is_uppercase()
53    };
54}
55
56#[macro_export]
57macro_rules! comment_1_char {
58    ($c: expr) => {
59        $c == '/'
60    };
61}
62
63#[macro_export]
64macro_rules! comment_2_char {
65    ($c: expr) => {
66        $c == '*'
67    };
68}
69
70#[macro_export]
71macro_rules! cut_char {
72    ($c: expr) => {
73        $c == '!'
74    };
75}
76
77#[macro_export]
78macro_rules! decimal_digit_char {
79    ($c: expr) => {
80        $c.is_ascii_digit()
81    };
82}
83
84#[macro_export]
85macro_rules! decimal_point_char {
86    ($c: expr) => {
87        $c == '.'
88    };
89}
90
91#[macro_export]
92macro_rules! double_quote_char {
93    ($c: expr) => {
94        $c == '"'
95    };
96}
97
98#[macro_export]
99macro_rules! end_line_comment_char {
100    ($c: expr) => {
101        $c == '%'
102    };
103}
104
105#[macro_export]
106macro_rules! exponent_char {
107    ($c: expr) => {
108        $c == 'e' || $c == 'E'
109    };
110}
111
112#[macro_export]
113macro_rules! graphic_char {
114    ($c: expr) => ($crate::char_class!($c, ['#', '$', '&', '*', '+', '-', '.', '/', ':',
115                                            '<', '=', '>', '?', '@', '^', '~']))
116}
117
118#[macro_export]
119macro_rules! graphic_token_char {
120    ($c: expr) => {
121        $crate::graphic_char!($c) || $crate::backslash_char!($c)
122    };
123}
124
125#[macro_export]
126macro_rules! hexadecimal_digit_char {
127    ($c: expr) => {
128        $c.is_ascii_digit() || ('A'..='F').contains(&$c) || ('a'..='f').contains(&$c)
129    };
130}
131
132#[macro_export]
133macro_rules! layout_char {
134    ($c: expr) => {
135        $crate::char_class!($c, [' ', '\r', '\n', '\t', '\u{0B}', '\u{0C}'])
136    };
137}
138
139#[macro_export]
140macro_rules! meta_char {
141    ($c: expr) => {
142        $crate::char_class!($c, ['\\', '\'', '"', '`'])
143    };
144}
145
146#[macro_export]
147macro_rules! new_line_char {
148    ($c: expr) => {
149        $c == '\n'
150    };
151}
152
153#[macro_export]
154macro_rules! octal_digit_char {
155    ($c: expr) => {
156        ('0'..='7').contains(&$c)
157    };
158}
159
160#[macro_export]
161macro_rules! binary_digit_char {
162    ($c: expr) => {
163        $c == '0' || $c == '1'
164    };
165}
166
167#[macro_export]
168macro_rules! prolog_char {
169    ($c: expr) => {
170        $crate::graphic_char!($c)
171            || $crate::alpha_numeric_char!($c)
172            || $crate::solo_char!($c)
173            || $crate::layout_char!($c)
174            || $crate::meta_char!($c)
175    };
176}
177
178#[macro_export]
179macro_rules! semicolon_char {
180    ($c: expr) => {
181        $c == ';'
182    };
183}
184
185#[macro_export]
186macro_rules! sign_char {
187    ($c: expr) => {
188        $c == '-' || $c == '+'
189    };
190}
191
192#[macro_export]
193macro_rules! single_quote_char {
194    ($c: expr) => {
195        $c == '\''
196    };
197}
198
199#[macro_export]
200macro_rules! small_letter_char {
201    ($c: expr) => {
202        $c.is_alphabetic() && !$c.is_uppercase()
203    };
204}
205
206#[macro_export]
207macro_rules! solo_char {
208    ($c: expr) => {
209        $crate::char_class!($c, ['!', '(', ')', ',', ';', '[', ']', '{', '}', '|', '%'])
210    };
211}
212
213#[macro_export]
214macro_rules! space_char {
215    ($c: expr) => {
216        $c == ' '
217    };
218}
219
220#[macro_export]
221macro_rules! symbolic_control_char {
222    ($c: expr) => {
223        $crate::char_class!($c, ['a', 'b', 'f', 'n', 'r', 't', 'v', '0'])
224    };
225}
226
227#[macro_export]
228macro_rules! symbolic_hexadecimal_char {
229    ($c: expr) => {
230        $c == 'x'
231    };
232}
233
234#[macro_export]
235macro_rules! variable_indicator_char {
236    ($c: expr) => {
237        $c == '_'
238    };
239}