mech_syntax/
base.rs

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 {
13  ($name:ident, $byte:expr, $token:expr) => (
14    pub fn $name(input: ParseString) -> ParseResult<Token> {
15      if input.is_empty() {
16        return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
17      }
18      let start = input.loc();
19      let byte = input.graphemes[input.cursor];
20      let (input, _) = tag($byte)(input)?;
21      let end = input.loc();
22      let src_range = SourceRange { start, end };
23      Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
24    }
25  )
26}
27
28macro_rules! ws0_leaf {
29  ($name:ident, $byte:expr, $token:expr) => (
30    pub fn $name(input: ParseString) -> ParseResult<Token> {
31      if input.is_empty() {
32        return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
33      }
34      let start = input.loc();
35      let byte = input.graphemes[input.cursor];
36      let (input, _) = whitespace0(input)?;
37      let (input, _) = tag($byte)(input)?;
38      let (input, _) = whitespace0(input)?;
39      let end = input.loc();
40      let src_range = SourceRange { start, end };
41      Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
42    }
43  )
44}
45
46macro_rules! ws1_leaf {
47  ($name:ident, $byte:expr, $token:expr) => (
48    pub fn $name(input: ParseString) -> ParseResult<Token> {
49      if input.is_empty() {
50        return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
51      }
52      let (input, _) = whitespace1(input)?;
53      let start = input.loc();
54      let byte = input.graphemes[input.cursor];
55      let (input, _) = tag($byte)(input)?;
56      let end = input.loc();
57      let (input, _) = whitespace1(input)?;
58      let src_range = SourceRange { start, end };
59      Ok((input, Token{kind: $token, chars: $byte.chars().collect::<Vec<char>>(), src_range}))
60    }
61  )
62}
63
64leaf!{at, "@", TokenKind::At}
65leaf!{hashtag, "#", TokenKind::HashTag}
66leaf!{period, ".", TokenKind::Period}
67leaf!{colon, ":", TokenKind::Colon}
68leaf!{comma, ",", TokenKind::Comma}
69leaf!{percent, "%", TokenKind::Percent}
70leaf!{apostrophe, "'", TokenKind::Apostrophe}
71leaf!{left_bracket, "[", TokenKind::LeftBracket}
72leaf!{right_bracket, "]", TokenKind::RightBracket}
73leaf!{left_parenthesis, "(", TokenKind::LeftParenthesis}
74leaf!{right_parenthesis, ")", TokenKind::RightParenthesis}
75leaf!{left_brace, "{", TokenKind::LeftBrace}
76leaf!{right_brace, "}", TokenKind::RightBrace}
77leaf!{dollar, "$", TokenKind::Dollar}
78leaf!{equal, "=", TokenKind::Equal}
79leaf!{left_angle, "<", TokenKind::LeftAngle}
80leaf!{right_angle, ">", TokenKind::RightAngle}
81leaf!{exclamation, "!", TokenKind::Exclamation}
82leaf!{question, "?", TokenKind::Question}
83leaf!{plus, "+", TokenKind::Plus}
84leaf!{dash, "-", TokenKind::Dash}
85leaf!{underscore, "_", TokenKind::Underscore}
86leaf!{asterisk, "*", TokenKind::Asterisk}
87leaf!{slash, "/", TokenKind::Slash}
88leaf!{backslash, "\\", TokenKind::Backslash}
89leaf!{caret, "^", TokenKind::Caret}
90leaf!{space, " ", TokenKind::Space}
91leaf!{tab, "\t", TokenKind::Tab}
92leaf!{tilde, "~", TokenKind::Tilde}
93leaf!{grave, "`", TokenKind::Grave}
94leaf!{bar, "|", TokenKind::Bar}
95leaf!{quote, "\"", TokenKind::Quote}
96leaf!{ampersand, "&", TokenKind::Ampersand}
97leaf!{semicolon, ";", TokenKind::Semicolon}
98leaf!{new_line_char, "\n", TokenKind::Newline}
99leaf!{carriage_return, "\r", TokenKind::CarriageReturn}
100leaf!{carriage_return_new_line, "\r\n", TokenKind::CarriageReturn}
101leaf!{english_true_literal, "true", TokenKind::True}
102leaf!{english_false_literal, "false", TokenKind::False}
103leaf!{check_mark, "✓", TokenKind::True}
104leaf!{cross, "✗", TokenKind::False}
105leaf!{negate, "¬", TokenKind::Not}
106
107leaf!{box_tl_round, "╭", TokenKind::BoxDrawing}
108leaf!{box_tr_round, "╮", TokenKind::BoxDrawing}
109leaf!{box_bl_round, "╰", TokenKind::BoxDrawing}
110leaf!{box_br_round, "╯", TokenKind::BoxDrawing}
111
112leaf!{box_tl_bold, "┏", TokenKind::BoxDrawing}
113leaf!{box_tr_bold, "┓", TokenKind::BoxDrawing} 
114leaf!{box_bl_bold, "┗", TokenKind::BoxDrawing}
115leaf!{box_br_bold, "┛", TokenKind::BoxDrawing}
116
117leaf!{box_tl, "┌", TokenKind::BoxDrawing}
118leaf!{box_tr, "┐", TokenKind::BoxDrawing}
119leaf!{box_bl, "└", TokenKind::BoxDrawing}
120leaf!{box_br, "┘", TokenKind::BoxDrawing}
121
122leaf!{box_cross, "┼", TokenKind::BoxDrawing}
123leaf!{box_horz, "─", TokenKind::BoxDrawing}
124leaf!{box_t_left, "├", TokenKind::BoxDrawing}
125leaf!{box_t_right, "┤", TokenKind::BoxDrawing}
126leaf!{box_t_top, "┬", TokenKind::BoxDrawing}
127leaf!{box_t_bottom, "┴", TokenKind::BoxDrawing}
128leaf!{box_vert, "│", TokenKind::BoxDrawing}
129leaf!{box_vert_bold, "┃", TokenKind::BoxDrawing}
130
131leaf!(http_prefix, "http", TokenKind::HttpPrefix);
132leaf!(img_prefix, "![", TokenKind::ImgPrefix);
133leaf!(footnote_prefix, "[^", TokenKind::FootnotePrefix);
134leaf!(abstract_sigil, "%%", TokenKind::AbstractSigil);
135leaf!(equation_sigil, "$$", TokenKind::EquationSigil);
136leaf!(highlight_sigil, "!!", TokenKind::HighlightSigil);
137leaf!(quote_sigil, ">", TokenKind::QuoteSigil);
138leaf!(float_left, "<<", TokenKind::FloatLeft);
139leaf!(float_right, ">>", TokenKind::FloatRight);
140leaf!(strong_sigil, "**", TokenKind::StrongSigil);
141leaf!(emphasis_sigil, "*", TokenKind::EmphasisSigil);
142leaf!(underline_sigil, "__", TokenKind::UnderlineSigil);
143leaf!(strike_sigil, "~~", TokenKind::StrikeSigil);
144leaf!(query_sigil, "??", TokenKind::QuerySigil);
145
146ws0_leaf!(define_operator, ":=", TokenKind::DefineOperator);
147ws0_leaf!(assign_operator, "=", TokenKind::AssignOperator);
148ws0_leaf!(output_operator, "=>", TokenKind::OutputOperator);
149ws0_leaf!(async_transition_operator, "~>", TokenKind::AsyncTransitionOperator);
150ws0_leaf!(transition_operator, "->", TokenKind::TransitionOperator);
151
152
153// emoji_grapheme := ?emoji_grapheme_literal? ;
154pub fn emoji_grapheme(mut input: ParseString) -> ParseResult<String> {
155  if let Some(matched) = input.consume_emoji() {
156    Ok((input, matched))
157  } else {
158    Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
159  }
160}
161
162// alpha := ?alpha_literal? ;
163pub fn alpha(mut input: ParseString) -> ParseResult<String> {
164  if let Some(matched) = input.consume_alpha() {
165    Ok((input, matched))
166  } else {
167    Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
168  }
169}
170
171// digit := ?digit_literal? ;
172pub fn digit(mut input: ParseString) -> ParseResult<String> {
173  if let Some(matched) = input.consume_digit() {
174    Ok((input, matched))
175  } else {
176    Err(nom::Err::Error(ParseError::new(input, "Unexpected character")))
177  }
178}
179
180// any := ?any_character? ;
181pub fn any(mut input: ParseString) -> ParseResult<String> {
182  if let Some(matched) = input.consume_one() {
183    Ok((input, matched))
184  } else {
185    Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
186  }
187}
188
189pub fn any_token(mut input: ParseString) -> ParseResult<Token> {
190  if input.is_empty() {
191    return Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
192  }
193  let start = input.loc();
194  let byte = input.graphemes[input.cursor];
195  if let Some(matched) = input.consume_one() {
196    let end = input.loc();
197    let src_range = SourceRange { start, end };
198    Ok((input, Token{kind: TokenKind::Any, chars: byte.chars().collect::<Vec<char>>(), src_range}))
199  } else {
200    Err(nom::Err::Error(ParseError::new(input, "Unexpected eof")))
201  }
202}
203
204// forbidden_emoji := box_drawing | other_forbidden_shapes ;
205pub fn forbidden_emoji(input: ParseString) -> ParseResult<Token> {
206  alt((box_tl, box_br, box_bl, box_tr, box_tr_bold, box_tl_bold, box_br_bold, box_bl_bold, box_t_left,box_tl_round,box_br_round, box_tr_round, box_bl_round, box_vert, box_cross, box_horz, box_t_right, box_t_top, box_t_bottom))(input)
207}
208
209// emoji := (!forbidden_emoji, emoji_grapheme) ;
210pub fn emoji(input: ParseString) -> ParseResult<Token> {
211  let msg1 = "Cannot be a box-drawing emoji";
212  let start = input.loc();
213  let (input, _) = is_not(forbidden_emoji)(input)?;
214  let (input, g) = emoji_grapheme(input)?;
215  let end = input.loc();
216  let src_range = SourceRange { start, end };
217  Ok((input, Token{kind: TokenKind::Emoji, chars: g.chars().collect::<Vec<char>>(), src_range}))
218}
219
220// alpha_token := alpha_literal_token ;
221pub fn alpha_token(input: ParseString) -> ParseResult<Token> {
222  let (input, (g, src_range)) = range(alpha)(input)?;
223  Ok((input, Token{kind: TokenKind::Alpha, chars: g.chars().collect::<Vec<char>>(), src_range}))
224}
225
226// digit_token := digit_literal_token ;
227pub fn digit_token(input: ParseString) -> ParseResult<Token> {
228  let (input, (g, src_range)) = range(digit)(input)?;
229  Ok((input, Token{kind: TokenKind::Digit, chars: g.chars().collect::<Vec<char>>(), src_range}))
230}
231
232// alphanumeric := alpha | digit ;
233pub fn alphanumeric(input: ParseString) -> ParseResult<Token> {
234  let (input, token) = alt((alpha_token, digit_token))(input)?; 
235  Ok((input, token))
236}
237
238// underscore_digit := underscore, digit ;
239pub fn underscore_digit(input: ParseString) -> ParseResult<Token> {
240  let (input, _) = underscore(input)?;
241  let (input, digit) = digit_token(input)?;
242  Ok((input,digit))
243}
244
245// digit_sequence := digit, (underscore_digit | digit)* ;
246pub fn digit_sequence(input: ParseString) -> ParseResult<Vec<Token>> {
247  let (input, mut start) = digit_token(input)?;
248  let (input, mut tokens) = many0(alt((underscore_digit,digit_token)))(input)?;
249  let mut all = vec![start];
250  all.append(&mut tokens);
251  Ok((input,all))
252}
253
254// grouping_symbol := left_parenthesis | right_parenthesis | left_angle | right_angle | left_brace | right_brace | left_bracket | right_bracket ;
255pub fn grouping_symbol(input: ParseString) -> ParseResult<Token> {
256  let (input, grouping) = alt((left_parenthesis, right_parenthesis, left_angle, right_angle, left_brace, right_brace, left_bracket, right_bracket))(input)?;
257  Ok((input, grouping))
258}
259
260// punctuation := period | exclamation | question | comma | colon | semicolon | quote | apostrophe ;
261pub fn punctuation(input: ParseString) -> ParseResult<Token> {
262  let (input, punctuation) = alt((period, exclamation, question, comma, colon, semicolon, quote, apostrophe))(input)?;
263  Ok((input, punctuation))
264}
265
266// escaped_char := "\" ,  symbol | punctuation ;
267pub fn escaped_char(input: ParseString) -> ParseResult<Token> {
268  let (input, _) = backslash(input)?;
269  let (input, symbol) = alt((symbol, punctuation))(input)?;
270  Ok((input, symbol))
271}
272
273// symbol := ampersand | bar | at | slash | hashtag | equal | backslash | tilde | plus | dash | asterisk | caret | underscore ;
274pub fn symbol(input: ParseString) -> ParseResult<Token> {
275  let (input, symbol) = alt((ampersand, dollar, bar, percent, at, slash, hashtag, equal, backslash, tilde, plus, dash, asterisk, caret, underscore))(input)?;
276  Ok((input, symbol))
277}
278
279// text := alpha | digit | space | tab | escaped_char | punctuation | grouping_symbol | symbol ;
280pub fn text(input: ParseString) -> ParseResult<Token> {
281  let (input, text) = alt((alpha_token, digit_token, emoji, forbidden_emoji, space, tab, escaped_char, punctuation, grouping_symbol, symbol))(input)?;
282  Ok((input, text))
283}
284
285// identifier := (alpha | emoji), (alpha | digit | symbol | emoji)* ;
286pub fn identifier(input: ParseString) -> ParseResult<Identifier> {
287  let (input, (first, mut rest)) = nom_tuple((alt((alpha_token, emoji)), many0(alt((alpha_token, digit_token, symbol, emoji)))))(input)?;
288  let mut tokens = vec![first];
289  tokens.append(&mut rest);
290  let mut merged = Token::merge_tokens(&mut tokens).unwrap();
291  merged.kind = TokenKind::Identifier; 
292  Ok((input, Identifier{name: merged}))
293}
294
295// boolean_literal := true_literal | false_literal ;
296pub fn boolean(input: ParseString) -> ParseResult<Token> {
297  let (input, boolean) = alt((true_literal, false_literal))(input)?;
298  Ok((input, boolean))
299}
300
301// true_literal := english_true_literal | check_mark ;
302pub fn true_literal(input: ParseString) -> ParseResult<Token> {
303  let (input, token) = alt((english_true_literal, check_mark))(input)?;
304  Ok((input, token))
305}
306
307// false_literal := english_false_literal | cross ;
308pub fn false_literal(input: ParseString) -> ParseResult<Token> {
309  let (input, token) = alt((english_false_literal, cross))(input)?;
310  Ok((input, token))
311}
312
313// new_line := carriage_return_new_line | new_line_char | carriage_return ;
314pub fn new_line(input: ParseString) -> ParseResult<Token> {
315  let (input, result) = alt((carriage_return_new_line,new_line_char,carriage_return))(input)?;
316  Ok((input, result))
317}
318
319// whitespace := space | new_line | tab ;
320pub fn whitespace(input: ParseString) -> ParseResult<Token> {
321  let (input, space) = alt((space,tab,new_line))(input)?;
322  Ok((input, space))
323}
324
325// whitespace0 := whitespace* ;
326pub fn whitespace0(input: ParseString) -> ParseResult<()> {
327  let (input, _) = many0(whitespace)(input)?;
328  Ok((input, ()))
329}
330
331// whitespace1 := whitespace+ ;
332pub fn whitespace1(input: ParseString) -> ParseResult<()> {
333  let (input, _) = many1(whitespace)(input)?;
334  Ok((input, ()))
335}
336
337// space_tab := space | tab ;
338pub fn space_tab(input: ParseString) -> ParseResult<Token> {
339  let (input, space) = alt((space,tab))(input)?;
340  Ok((input, space))
341}
342
343// list_separator := whitespace*, ",", whitespace* ;
344pub fn list_separator(input: ParseString) -> ParseResult<()> {
345  let (input,_) = nom_tuple((whitespace0,tag(","),whitespace0))(input)?;
346  Ok((input, ()))
347}
348
349// enum_separator := whitespace*, "|", whitespace* ;
350pub fn enum_separator(input: ParseString) -> ParseResult<()> {
351  let (input,_) = nom_tuple((whitespace0,tag("|"),whitespace0))(input)?;
352  Ok((input, ()))
353}
354
355
356// number := real_number, "i"? | ("+", real_number, "i")? ;
357
358pub fn number(input: ParseString) -> ParseResult<Number> {
359  let (input, real_num) = real_number(input)?;
360  match tag("i")(input.clone()) {
361    Ok((input,_)) => {
362      return Ok((input, Number::Imaginary(
363        ComplexNumber{
364          real: None, 
365          imaginary: ImaginaryNumber{number: real_num}
366        })));
367      }
368    _ => match nom_tuple((plus,real_number,tag("i")))(input.clone()) {
369      Ok((input, (_,imaginary_num,_))) => {
370        return Ok((input, Number::Imaginary(
371          ComplexNumber{
372            real: Some(real_num), 
373            imaginary: ImaginaryNumber{number: imaginary_num},
374          })));
375        }
376      _ => ()
377    }
378  }
379  Ok((input, Number::Real(real_num)))
380}
381
382// real_number := dash?, (hexadecimal_literal | decimal_literal | octal_literal | binary_literal | scientific_literal | rational_literal | float_literal | integer_literal) ;
383pub fn real_number(input: ParseString) -> ParseResult<RealNumber> {
384  let (input, neg) = opt(dash)(input)?;
385  let (input, result) = alt((hexadecimal_literal, decimal_literal, octal_literal, binary_literal, scientific_literal, rational_literal, float_literal, integer_literal))(input)?;
386  let result = match neg {
387    Some(_) => RealNumber::Negated(Box::new(result)),
388    None => result,
389  };
390  Ok((input, result))
391}
392
393// rational_literal := integer_literal, "/", integer_literal ;
394pub fn rational_literal(input: ParseString) -> ParseResult<RealNumber> {
395  let (input, RealNumber::Integer(numerator)) = integer_literal(input)? else { unreachable!() };
396  let (input, _) = slash(input)?;
397  let (input, RealNumber::Integer(denominator)) = integer_literal(input)? else { unreachable!() };
398  Ok((input, RealNumber::Rational((numerator,denominator))))
399}
400
401// scientific_literal := (float_literal | integer_literal), ("e" | "E"), plus?, dash?, (float_literal | integer_literal) ;
402pub fn scientific_literal(input: ParseString) -> ParseResult<RealNumber> {
403  let (input, base) = match float_literal(input.clone()) {
404    Ok((input, RealNumber::Float(base))) => {
405      (input, base)
406    }
407    _ => match integer_literal(input.clone()) {
408      Ok((input, RealNumber::Integer(base))) => {
409        (input, (base, Token::default()))
410      }
411      Err(err) => {return Err(err);}
412      _ => unreachable!(),
413    }
414  };
415  let (input, _) = alt((tag("e"), tag("E")))(input)?;
416  let (input, _) = opt(plus)(input)?;
417  let (input, neg) = opt(dash)(input)?;
418  let (input, (ex_whole,ex_part)) = match float_literal(input.clone()) {
419    Ok((input, RealNumber::Float(exponent))) => {
420      (input, exponent)
421    }
422    _ => match integer_literal(input.clone()) {
423      Ok((input, RealNumber::Integer(exponent))) => {
424        (input, (exponent, Token::default()))
425      }
426      Err(err) => {return Err(err);}
427      _ => unreachable!(),
428    }
429  };
430  let ex_sign = match neg {
431    Some(_) => true,
432    None => false,
433  };
434  Ok((input, RealNumber::Scientific((base,(ex_sign,ex_whole,ex_part)))))
435}
436
437// float_decimal_start := ".", digit_sequence ;
438pub fn float_decimal_start(input: ParseString) -> ParseResult<RealNumber> {
439  let (input, _) = period(input)?;
440  let (input, part) = digit_sequence(input)?;
441  let mut tokens2 = part.clone();
442  let mut merged = Token::merge_tokens(&mut tokens2).unwrap();
443  merged.kind = TokenKind::Number;
444  Ok((input, RealNumber::Float((Token::default(),merged))))
445}
446
447// float_full := digit_sequence, ".", digit_sequnce ;
448pub fn float_full(input: ParseString) -> ParseResult<RealNumber> {
449  let (input, mut whole) = digit_sequence(input)?;
450  let (input, _) = period(input)?;
451  let (input, mut part) = digit_sequence(input)?;
452  let mut whole = Token::merge_tokens(&mut whole).unwrap();
453  let mut part = Token::merge_tokens(&mut part).unwrap();
454  whole.kind = TokenKind::Number;
455  part.kind = TokenKind::Number;
456  Ok((input, RealNumber::Float((whole,part))))
457}
458
459// float_literal := float_decimal_start | float_full;
460pub fn float_literal(input: ParseString) -> ParseResult<RealNumber> {
461  let (input, result) = alt((float_decimal_start,float_full))(input)?;
462  Ok((input, result))
463}
464
465// integer := digit1 ;
466pub fn integer_literal(input: ParseString) -> ParseResult<RealNumber> {
467  let (input, mut digits) = digit_sequence(input)?;
468  let mut merged = Token::merge_tokens(&mut digits).unwrap();
469  merged.kind = TokenKind::Number; 
470  Ok((input, RealNumber::Integer(merged)))
471}
472
473// decimal_literal := "0d", <digit1> ;
474pub fn decimal_literal(input: ParseString) -> ParseResult<RealNumber> {
475  let msg = "Expects decimal digits after \"0d\"";
476  let input = tag("0d")(input);
477  let (input, _) = input?;
478  let (input, mut tokens) = label!(digit_sequence, msg)(input)?;
479  let mut merged = Token::merge_tokens(&mut tokens).unwrap();
480  merged.kind = TokenKind::Number; 
481  Ok((input, RealNumber::Decimal(merged)))
482}
483
484// hexadecimal_literal := "0x", <hex_digit+> ;
485pub fn hexadecimal_literal(input: ParseString) -> ParseResult<RealNumber> {
486  let msg = "Expects hexadecimal digits after \"0x\"";
487  let input = tag("0x")(input);
488  let (input, _) = input?;
489  let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
490  let mut merged = Token::merge_tokens(&mut tokens).unwrap();
491  merged.kind = TokenKind::Number; 
492  Ok((input, RealNumber::Hexadecimal(merged)))
493}
494
495// octal_literal := "0o", <oct_digit+> ;
496pub fn octal_literal(input: ParseString) -> ParseResult<RealNumber> {
497  let msg = "Expects octal digits after \"0o\"";
498  let input = tag("0o")(input);
499  let (input, _) = input?;
500  let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
501  let mut merged = Token::merge_tokens(&mut tokens).unwrap();
502  merged.kind = TokenKind::Number; 
503  Ok((input, RealNumber::Octal(merged)))
504}
505
506// binary_literal := "0b", <bin_digit+> ;
507pub fn binary_literal(input: ParseString) -> ParseResult<RealNumber> {
508  let msg = "Expects binary digits after \"0b\"";
509  let input = tag("0b")(input);
510  let (input, _) = input?;
511  let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
512  let mut merged = Token::merge_tokens(&mut tokens).unwrap();
513  merged.kind = TokenKind::Number; 
514  Ok((input, RealNumber::Binary(merged)))
515}
516
517// empty := underscore+ ;
518pub fn empty(input: ParseString) -> ParseResult<Token> {
519  let (input, (g, src_range)) = range(many1(tag("_")))(input)?;
520  Ok((input, Token{kind: TokenKind::Empty, chars: g.join("").chars().collect(), src_range}))
521}
522
523// #### Kind Annotations
524
525// kind_annotation := left_angle, kind, right_angle ;
526pub fn kind_annotation(input: ParseString) -> ParseResult<KindAnnotation> {
527  let msg2 = "Expects at least one unit in kind annotation";
528  let msg3 = "Expects right angle";
529  let (input, (_, r)) = range(left_angle)(input)?;
530  let (input, kind) = kind(input)?;
531  let (input, _) = label!(right_angle, msg3, r)(input)?;
532  Ok((input, KindAnnotation{ kind }))
533}
534
535// kind := kind_fxn | kind_empty | kind_atom | kind_tuple | kind_scalar | kind_bracket | kind_map | kind_brace ;
536pub fn kind(input: ParseString) -> ParseResult<Kind> {
537  let (input, kind) = alt((kind_fxn,kind_empty,kind_atom,kind_tuple,kind_scalar,kind_bracket,kind_map,kind_brace))(input)?;
538  Ok((input, kind))
539}
540
541// kind_empty := underscore+ ;
542pub fn kind_empty(input: ParseString) -> ParseResult<Kind> {
543  let (input, _) = many1(underscore)(input)?;
544  Ok((input, Kind::Empty))
545}
546
547// kind_atom := "`", identifier ;
548pub fn kind_atom(input: ParseString) -> ParseResult<Kind> {
549  let (input, _) = grave(input)?;
550  let (input, atm) = identifier(input)?;
551  Ok((input, Kind::Atom(atm)))
552}
553
554// kind_map := "{", kind, ":", kind, "}" ;
555pub fn kind_map(input: ParseString) -> ParseResult<Kind> {
556  let (input, _) = left_brace(input)?;
557  let (input, key_kind) = kind(input)?;
558  let (input, _) = colon(input)?;
559  let (input, value_kind) = kind(input)?;
560  let (input, _) = right_brace(input)?;
561  Ok((input, Kind::Map(Box::new(key_kind),Box::new(value_kind))))
562}
563
564// kind_fxn := "(", list0(list_separator, kind), ")", "=", "(", list0(list_separator, kind), ")" ;
565pub fn kind_fxn(input: ParseString) -> ParseResult<Kind> {
566  let (input, _) = left_parenthesis(input)?;
567  let (input, input_kinds) = separated_list0(list_separator,kind)(input)?;
568  let (input, _) = right_parenthesis(input)?;
569  let (input, _) = equal(input)?;
570  let (input, _) = left_parenthesis(input)?;
571  let (input, output_kinds) = separated_list0(list_separator,kind)(input)?;
572  let (input, _) = right_parenthesis(input)?;
573  Ok((input, Kind::Function(input_kinds,output_kinds)))
574}
575
576// kind_brace := "{", list1(",", kind), "}", ":"?, list0("," , literal) ;
577pub fn kind_brace(input: ParseString) -> ParseResult<Kind> {
578  let (input, _) = left_brace(input)?;
579  let (input, kinds) = separated_list1(list_separator,kind)(input)?;
580  let (input, _) = right_brace(input)?;
581  let (input, _) = opt(colon)(input)?;
582  let (input, size) = separated_list0(list_separator,literal)(input)?;
583  Ok((input, Kind::Brace((kinds,size))))
584}
585
586// kind_bracket := "[", list1(",",kind), "]", ":"?, list0(",", literal) ;
587pub fn kind_bracket(input: ParseString) -> ParseResult<Kind> {
588  let (input, _) = left_bracket(input)?;
589  let (input, kinds) = separated_list1(list_separator,kind)(input)?;
590  let (input, _) = right_bracket(input)?;
591  let (input, _) = opt(colon)(input)?;
592  let (input, size) = separated_list0(list_separator,literal)(input)?;
593  Ok((input, Kind::Bracket((kinds,size))))
594}
595
596// kind_tuple := "(", list1(",", kind), ")" ;
597pub fn kind_tuple(input: ParseString) -> ParseResult<Kind> {
598  let (input, _) = left_parenthesis(input)?;
599  let (input, kinds) = separated_list1(list_separator, kind)(input)?;
600  let (input, _) = right_parenthesis(input)?;
601  Ok((input, Kind::Tuple(kinds)))
602}
603
604// kind_scalar := identifier, [":", range_expression] ;
605pub fn kind_scalar(input: ParseString) -> ParseResult<Kind> {
606  let (input, kind) = identifier(input)?;
607  let (input, range) = opt(tuple((colon,range_expression)))(input)?;
608  Ok((input, Kind::Scalar(kind)))
609}