1#[macro_use]
2use crate::parser::*;
3use crate::*;
4use crate::label;
5use crate::labelr;
6use nom::{
7 multi::separated_list0,
8 sequence::tuple as nom_tuple,
9};
10use crate::nodes::Kind;
11
12macro_rules! leaf {
17 ($name:ident, $byte:expr, $token:expr) => (
18 pub fn $name(input: ParseString) -> ParseResult<Token> {
19 if input.is_empty() {
20 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
21 }
22 let start = input.loc();
23 let byte = input.graphemes[input.cursor];
24 let (input, _) = tag($byte)(input)?;
25 let end = input.loc();
26 let src_range = SourceRange { start, end };
27 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
28 }
29 )
30}
31
32macro_rules! ws0_leaf {
33 ($name:ident, $byte:expr, $token:expr) => (
34 pub fn $name(input: ParseString) -> ParseResult<Token> {
35 if input.is_empty() {
36 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
37 }
38 let start = input.loc();
39 let byte = input.graphemes[input.cursor];
40 let (input, _) = whitespace0(input)?;
41 let (input, _) = tag($byte)(input)?;
42 let (input, _) = whitespace0(input)?;
43 let end = input.loc();
44 let src_range = SourceRange { start, end };
45 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
46 }
47 )
48}
49
50macro_rules! ws1_leaf {
51 ($name:ident, $byte:expr, $token:expr) => (
52 pub fn $name(input: ParseString) -> ParseResult<Token> {
53 if input.is_empty() {
54 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
55 }
56 let (input, _) = whitespace1(input)?;
57 let start = input.loc();
58 let byte = input.graphemes[input.cursor];
59 let (input, _) = tag($byte)(input)?;
60 let end = input.loc();
61 let (input, _) = whitespace1(input)?;
62 let src_range = SourceRange { start, end };
63 Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
64 }
65 )
66}
67
68leaf!{ampersand, "&", TokenKind::Ampersand}
73leaf!{apostrophe, "'", TokenKind::Apostrophe}
74leaf!{asterisk, "*", TokenKind::Asterisk}
75leaf!{at, "@", TokenKind::At}
76leaf!{bar, "|", TokenKind::Bar}
77leaf!{backslash, "\\", TokenKind::Backslash}
78leaf!{caret, "^", TokenKind::Caret}
79leaf!{colon, ":", TokenKind::Colon}
80leaf!{comma, ",", TokenKind::Comma}
81leaf!{dash, "-", TokenKind::Dash}
82leaf!{dollar, "$", TokenKind::Dollar}
83leaf!{equal, "=", TokenKind::Equal}
84leaf!{exclamation, "!", TokenKind::Exclamation}
85leaf!{grave, "`", TokenKind::Grave}
86leaf!{hashtag, "#", TokenKind::HashTag}
87leaf!{negate, "¬", TokenKind::Not}
88leaf!{percent, "%", TokenKind::Percent}
89leaf!{period, ".", TokenKind::Period}
90leaf!{plus, "+", TokenKind::Plus}
91leaf!{question, "?", TokenKind::Question}
92leaf!{quote, "\"", TokenKind::Quote}
93leaf!{semicolon, ";", TokenKind::Semicolon}
94leaf!{slash, "/", TokenKind::Slash}
95leaf!{tilde, "~", TokenKind::Tilde}
96leaf!{underscore, "_", TokenKind::Underscore}
97
98leaf!{check_mark, "✓", TokenKind::True}
99leaf!{cross, "✗", TokenKind::False}
100leaf!{english_true_literal, "true", TokenKind::True}
101leaf!{english_false_literal, "false", TokenKind::False}
102
103leaf!{space, " ", TokenKind::Space}
104leaf!{new_line_char, "\n", TokenKind::Newline}
105leaf!{carriage_return, "\r", TokenKind::CarriageReturn}
106leaf!{carriage_return_new_line, "\r\n", TokenKind::CarriageReturn}
107leaf!{tab, "\t", TokenKind::Tab}
108
109leaf!{left_bracket, "[", TokenKind::LeftBracket}
110leaf!{left_parenthesis, "(", TokenKind::LeftParenthesis}
111leaf!{left_brace, "{", TokenKind::LeftBrace}
112leaf!{left_angle, "<", TokenKind::LeftAngle}
113
114leaf!{right_bracket, "]", TokenKind::RightBracket}
115leaf!{right_parenthesis, ")", TokenKind::RightParenthesis}
116leaf!{right_brace, "}", TokenKind::RightBrace}
117leaf!{right_angle, ">", TokenKind::RightAngle}
118
119leaf!{box_tl_round, "╭", TokenKind::BoxDrawing}
120leaf!{box_tr_round, "╮", TokenKind::BoxDrawing}
121leaf!{box_bl_round, "╰", TokenKind::BoxDrawing}
122leaf!{box_br_round, "╯", TokenKind::BoxDrawing}
123
124leaf!{box_tl_bold, "┏", TokenKind::BoxDrawing}
125leaf!{box_tr_bold, "┓", TokenKind::BoxDrawing}
126leaf!{box_bl_bold, "┗", TokenKind::BoxDrawing}
127leaf!{box_br_bold, "┛", TokenKind::BoxDrawing}
128
129leaf!{box_tl, "┌", TokenKind::BoxDrawing}
130leaf!{box_tr, "┐", TokenKind::BoxDrawing}
131leaf!{box_bl, "└", TokenKind::BoxDrawing}
132leaf!{box_br, "┘", TokenKind::BoxDrawing}
133
134leaf!{box_cross, "┼", TokenKind::BoxDrawing}
135leaf!{box_horz, "─", TokenKind::BoxDrawing}
136leaf!{box_t_left, "├", TokenKind::BoxDrawing}
137leaf!{box_t_right, "┤", TokenKind::BoxDrawing}
138leaf!{box_t_top, "┬", TokenKind::BoxDrawing}
139leaf!{box_t_bottom, "┴", TokenKind::BoxDrawing}
140leaf!{box_vert, "│", TokenKind::BoxDrawing}
141leaf!{box_vert_bold, "┃", TokenKind::BoxDrawing}
142
143leaf!(abstract_sigil, "%%", TokenKind::AbstractSigil);
144leaf!(emphasis_sigil, "*", TokenKind::EmphasisSigil);
145leaf!(equation_sigil, "$$", TokenKind::EquationSigil);
146leaf!(footnote_prefix, "[^", TokenKind::FootnotePrefix);
147leaf!(float_left, "<<", TokenKind::FloatLeft);
148leaf!(float_right, ">>", TokenKind::FloatRight);
149leaf!(http_prefix, "http", TokenKind::HttpPrefix);
150leaf!(highlight_sigil, "!!", TokenKind::HighlightSigil);
151leaf!(img_prefix, "![", TokenKind::ImgPrefix);
152leaf!(quote_sigil, ">", TokenKind::QuoteSigil);
153leaf!(question_sigil, "(?)>", TokenKind::QuestionSigil);
154leaf!(info_sigil, "(i)>", TokenKind::InfoSigil);
155leaf!(idea_sigil, "(*)>", TokenKind::IdeaSigil);
156leaf!(warning_sigil, "(!)>", TokenKind::WarningSigil);
157leaf!(error_sigil, "(x)>", TokenKind::ErrorSigil);
158leaf!(error_alt_sigil, "(✗)>", TokenKind::ErrorSigil);
159leaf!(success_check_sigil, "(✓)>", TokenKind::SuccessSigil);
160leaf!(success_sigil, "(+)>", TokenKind::SuccessSigil);
161leaf!(strike_sigil, "~~", TokenKind::StrikeSigil);
162leaf!(strong_sigil, "**", TokenKind::StrongSigil);
163leaf!(grave_codeblock_sigil, "```", TokenKind::GraveCodeBlockSigil);
164leaf!(tilde_codeblock_sigil, "~~~", TokenKind::TildeCodeBlockSigil);
165leaf!(underline_sigil, "__", TokenKind::UnderlineSigil);
166leaf!(section_sigil, "§", TokenKind::SectionSigil);
167
168ws0_leaf!(assign_operator, "=", TokenKind::AssignOperator);
169ws0_leaf!(async_transition_operator, "~>", TokenKind::AsyncTransitionOperator);
170ws0_leaf!(define_operator, ":=", TokenKind::DefineOperator);
171ws0_leaf!(query_operator, "?=", TokenKind::QueryOperator);
172ws0_leaf!(output_operator, "=>", TokenKind::OutputOperator);
173ws0_leaf!(transition_operator, "->", TokenKind::TransitionOperator);
174
175
176pub fn emoji_grapheme(mut input: ParseString) -> ParseResult<String> {
178 if let Some(matched) = input.consume_emoji() {
179 Ok((input, matched))
180 } else {
181 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
182 }
183}
184
185pub fn alpha(mut input: ParseString) -> ParseResult<String> {
187 if let Some(matched) = input.consume_alpha() {
188 Ok((input, matched))
189 } else {
190 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
191 }
192}
193
194pub fn digit(mut input: ParseString) -> ParseResult<String> {
196 if let Some(matched) = input.consume_digit() {
197 Ok((input, matched))
198 } else {
199 Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
200 }
201}
202
203pub fn any(mut input: ParseString) -> ParseResult<String> {
205 if let Some(matched) = input.consume_one() {
206 Ok((input, matched))
207 } else {
208 Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
209 }
210}
211
212pub fn any_token(mut input: ParseString) -> ParseResult<Token> {
213 if input.is_empty() {
214 return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
215 }
216 let start = input.loc();
217 let byte = input.graphemes[input.cursor];
218 if let Some(matched) = input.consume_one() {
219 let end = input.loc();
220 let src_range = SourceRange { start, end };
221 Ok((input, Token{kind: TokenKind::Any, chars: byte.chars().collect::<Vec<char>>(), src_range}))
222 } else {
223 Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
224 }
225}
226
227pub fn forbidden_emoji(input: ParseString) -> ParseResult<Token> {
229 box_drawing_emoji(input)
230}
231
232pub fn emoji(input: ParseString) -> ParseResult<Token> {
234 let msg1 = "Cannot be a box-drawing emoji";
235 let start = input.loc();
236 let (input, _) = is_not(forbidden_emoji)(input)?;
237 let (input, g) = emoji_grapheme(input)?;
238 let end = input.loc();
239 let src_range = SourceRange { start, end };
240 Ok((input, Token{kind: TokenKind::Emoji, chars: g.chars().collect::<Vec<char>>(), src_range}))
241}
242
243pub fn alpha_token(input: ParseString) -> ParseResult<Token> {
245 let (input, (g, src_range)) = range(alpha)(input)?;
246 Ok((input, Token{kind: TokenKind::Alpha, chars: g.chars().collect::<Vec<char>>(), src_range}))
247}
248
249pub fn digit_token(input: ParseString) -> ParseResult<Token> {
251 let (input, (g, src_range)) = range(digit)(input)?;
252 Ok((input, Token{kind: TokenKind::Digit, chars: g.chars().collect::<Vec<char>>(), src_range}))
253}
254
255pub fn alphanumeric(input: ParseString) -> ParseResult<Token> {
257 let (input, token) = alt((alpha_token, digit_token))(input)?;
258 Ok((input, token))
259}
260
261pub fn underscore_digit(input: ParseString) -> ParseResult<Token> {
263 let (input, _) = underscore(input)?;
264 let (input, digit) = digit_token(input)?;
265 Ok((input,digit))
266}
267
268pub fn digit_sequence(input: ParseString) -> ParseResult<Vec<Token>> {
270 let (input, mut start) = digit_token(input)?;
271 let (input, mut tokens) = many0(alt((underscore_digit,digit_token)))(input)?;
272 let mut all = vec![start];
273 all.append(&mut tokens);
274 Ok((input,all))
275}
276
277pub fn grouping_symbol(input: ParseString) -> ParseResult<Token> {
279 let (input, grouping) = alt((left_parenthesis, right_parenthesis, left_angle, right_angle, left_brace, right_brace, left_bracket, right_bracket))(input)?;
280 Ok((input, grouping))
281}
282
283pub fn punctuation(input: ParseString) -> ParseResult<Token> {
285 let (input, punctuation) = alt((period, exclamation, question, comma, colon, semicolon, quote, apostrophe))(input)?;
286 Ok((input, punctuation))
287}
288
289pub fn escaped_char(input: ParseString) -> ParseResult<Token> {
291 let (input, _) = backslash(input)?;
292 let (input, symbol) = alt((alpha_token, symbol, punctuation))(input)?;
293 Ok((input, symbol))
294}
295
296pub fn symbol(input: ParseString) -> ParseResult<Token> {
298 let (input, symbol) = alt((ampersand, grave, dollar, bar, percent, at, slash, hashtag, equal, backslash, tilde, plus, dash, asterisk, caret, underscore))(input)?;
299 Ok((input, symbol))
300}
301
302pub fn identifier_symbol(input: ParseString) -> ParseResult<Token> {
304 let (input, symbol) = alt((ampersand, dollar, percent, at, slash, hashtag, backslash, tilde, plus, dash, asterisk, caret))(input)?;
305 Ok((input, symbol))
306}
307
308pub fn text(input: ParseString) -> ParseResult<Token> {
310 let (input, text) = alt((alpha_token, digit_token, emoji, forbidden_emoji, space, tab, escaped_char, punctuation, grouping_symbol, symbol))(input)?;
311 Ok((input, text))
312}
313
314pub fn new_line(input: ParseString) -> ParseResult<Token> {
320 let (input, result) = alt((carriage_return_new_line,new_line_char,carriage_return))(input)?;
321 Ok((input, result))
322}
323
324pub fn whitespace(input: ParseString) -> ParseResult<Token> {
326 let (input, space) = alt((space,tab,new_line))(input)?;
327 Ok((input, space))
328}
329
330pub fn whitespace0(input: ParseString) -> ParseResult<()> {
332 let (input, _) = many0(whitespace)(input)?;
333 Ok((input, ()))
334}
335
336pub fn whitespace1(input: ParseString) -> ParseResult<()> {
338 let (input, _) = many1(whitespace)(input)?;
339 Ok((input, ()))
340}
341
342pub fn newline_indent(input: ParseString) -> ParseResult<()> {
344 let (input, _) = new_line(input)?;
345 let (input, _) = many0(space_tab)(input)?;
346 Ok((input, ()))
347}
348
349pub fn ws1e(input: ParseString) -> ParseResult<()> {
351 let (input, _) = many1(space_tab)(input)?;
352 Ok((input, ()))
353}
354
355pub fn ws0e(input: ParseString) -> ParseResult<()> {
357 let (input, _) = many0(space_tab)(input)?;
358 Ok((input, ()))
359}
360
361pub fn space_tab(input: ParseString) -> ParseResult<Token> {
363 let (input, space) = alt((space,tab))(input)?;
364 Ok((input, space))
365}
366
367pub fn space_tab0(input: ParseString) -> ParseResult<()> {
369 let (input, _) = many0(space_tab)(input)?;
370 Ok((input, ()))
371}
372
373pub fn space_tab1(input: ParseString) -> ParseResult<()> {
375 let (input, _) = many1(space_tab)(input)?;
376 Ok((input, ()))
377}
378
379pub fn list_separator(input: ParseString) -> ParseResult<()> {
381 let (input,_) = nom_tuple((whitespace0,tag(","),whitespace0))(input)?;
382 Ok((input, ()))
383}
384
385pub fn enum_separator(input: ParseString) -> ParseResult<()> {
387 let (input,_) = nom_tuple((whitespace0,tag("|"),whitespace0))(input)?;
388 Ok((input, ()))
389}
390
391pub fn identifier(input: ParseString) -> ParseResult<Identifier> {
397 let (input, (first, mut rest)) = nom_tuple((alt((alpha_token, emoji)), many0(alt((alpha_token, digit_token, identifier_symbol, emoji)))))(input)?;
398 let mut tokens = vec![first];
399 tokens.append(&mut rest);
400 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
401 merged.kind = TokenKind::Identifier;
402 Ok((input, Identifier{name: merged}))
403}