1#[macro_use]
2use crate::*;
3use nom::{
4 multi::separated_list0,
5 sequence::tuple as nom_tuple,
6};
7use crate::nodes::Kind;
8
9pub fn boolean(input: ParseString) -> ParseResult<Token> {
11 let (input, boolean) = alt((true_literal, false_literal))(input)?;
12 Ok((input, boolean))
13}
14
15pub fn true_literal(input: ParseString) -> ParseResult<Token> {
17 let (input, token) = alt((english_true_literal, check_mark))(input)?;
18 Ok((input, token))
19}
20
21pub fn false_literal(input: ParseString) -> ParseResult<Token> {
23 let (input, token) = alt((english_false_literal, cross))(input)?;
24 Ok((input, token))
25}
26
27pub fn number(input: ParseString) -> ParseResult<Number> {
29 let (input, real_num) = real_number(input)?;
30 match tag("i")(input.clone()) {
31 Ok((input,_)) => {
32 return Ok((input, Number::Imaginary(
33 ComplexNumber{
34 real: None,
35 imaginary: ImaginaryNumber{number: real_num}
36 })));
37 }
38 _ => match nom_tuple((plus,real_number,tag("i")))(input.clone()) {
39 Ok((input, (_,imaginary_num,_))) => {
40 return Ok((input, Number::Imaginary(
41 ComplexNumber{
42 real: Some(real_num),
43 imaginary: ImaginaryNumber{number: imaginary_num},
44 })));
45 }
46 _ => ()
47 }
48 }
49 Ok((input, Number::Real(real_num)))
50}
51
52pub fn real_number(input: ParseString) -> ParseResult<RealNumber> {
54 let (input, neg) = opt(dash)(input)?;
55 let (input, result) = alt((hexadecimal_literal, decimal_literal, octal_literal, binary_literal, scientific_literal, rational_literal, float_literal, integer_literal))(input)?;
56 let result = match neg {
57 Some(_) => RealNumber::Negated(Box::new(result)),
58 None => result,
59 };
60 Ok((input, result))
61}
62
63pub fn rational_literal(input: ParseString) -> ParseResult<RealNumber> {
65 let (input, RealNumber::Integer(numerator)) = integer_literal(input)? else { unreachable!() };
66 let (input, _) = slash(input)?;
67 let (input, RealNumber::Integer(denominator)) = integer_literal(input)? else { unreachable!() };
68 Ok((input, RealNumber::Rational((numerator,denominator))))
69}
70
71pub fn scientific_literal(input: ParseString) -> ParseResult<RealNumber> {
73 let (input, base) = match float_literal(input.clone()) {
74 Ok((input, RealNumber::Float(base))) => {
75 (input, base)
76 }
77 _ => match integer_literal(input.clone()) {
78 Ok((input, RealNumber::Integer(base))) => {
79 (input, (base, Token::default()))
80 }
81 Err(err) => {return Err(err);}
82 _ => unreachable!(),
83 }
84 };
85 let (input, _) = alt((tag("e"), tag("E")))(input)?;
86 let (input, _) = opt(plus)(input)?;
87 let (input, neg) = opt(dash)(input)?;
88 let (input, (ex_whole,ex_part)) = match float_literal(input.clone()) {
89 Ok((input, RealNumber::Float(exponent))) => {
90 (input, exponent)
91 }
92 _ => match integer_literal(input.clone()) {
93 Ok((input, RealNumber::Integer(exponent))) => {
94 (input, (exponent, Token::default()))
95 }
96 Err(err) => {return Err(err);}
97 _ => unreachable!(),
98 }
99 };
100 let ex_sign = match neg {
101 Some(_) => true,
102 None => false,
103 };
104 Ok((input, RealNumber::Scientific((base,(ex_sign,ex_whole,ex_part)))))
105}
106
107pub fn float_decimal_start(input: ParseString) -> ParseResult<RealNumber> {
109 let (input, _) = period(input)?;
110 let (input, part) = digit_sequence(input)?;
111 let mut tokens2 = part.clone();
112 let mut merged = Token::merge_tokens(&mut tokens2).unwrap();
113 merged.kind = TokenKind::Number;
114 Ok((input, RealNumber::Float((Token::default(),merged))))
115}
116
117pub fn float_full(input: ParseString) -> ParseResult<RealNumber> {
119 let (input, mut whole) = digit_sequence(input)?;
120 let (input, _) = period(input)?;
121 let (input, mut part) = digit_sequence(input)?;
122 let mut whole = Token::merge_tokens(&mut whole).unwrap();
123 let mut part = Token::merge_tokens(&mut part).unwrap();
124 whole.kind = TokenKind::Number;
125 part.kind = TokenKind::Number;
126 Ok((input, RealNumber::Float((whole,part))))
127}
128
129pub fn float_literal(input: ParseString) -> ParseResult<RealNumber> {
131 let (input, result) = alt((float_decimal_start,float_full))(input)?;
132 Ok((input, result))
133}
134
135pub fn integer_literal(input: ParseString) -> ParseResult<RealNumber> {
137 let (input, mut digits) = digit_sequence(input)?;
138 let mut merged = Token::merge_tokens(&mut digits).unwrap();
139 merged.kind = TokenKind::Number;
140 Ok((input, RealNumber::Integer(merged)))
141}
142
143pub fn decimal_literal(input: ParseString) -> ParseResult<RealNumber> {
145 let msg = "Expects decimal digits after \"0d\"";
146 let input = tag("0d")(input);
147 let (input, _) = input?;
148 let (input, mut tokens) = label!(digit_sequence, msg)(input)?;
149 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
150 merged.kind = TokenKind::Number;
151 Ok((input, RealNumber::Decimal(merged)))
152}
153
154pub fn hexadecimal_literal(input: ParseString) -> ParseResult<RealNumber> {
156 let msg = "Expects hexadecimal digits after \"0x\"";
157 let input = tag("0x")(input);
158 let (input, _) = input?;
159 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
160 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
161 merged.kind = TokenKind::Number;
162 Ok((input, RealNumber::Hexadecimal(merged)))
163}
164
165pub fn octal_literal(input: ParseString) -> ParseResult<RealNumber> {
167 let msg = "Expects octal digits after \"0o\"";
168 let input = tag("0o")(input);
169 let (input, _) = input?;
170 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
171 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
172 merged.kind = TokenKind::Number;
173 Ok((input, RealNumber::Octal(merged)))
174}
175
176pub fn binary_literal(input: ParseString) -> ParseResult<RealNumber> {
178 let msg = "Expects binary digits after \"0b\"";
179 let input = tag("0b")(input);
180 let (input, _) = input?;
181 let (input, mut tokens) = label!(many1(alt((digit_token,underscore,alpha_token))), msg)(input)?;
182 let mut merged = Token::merge_tokens(&mut tokens).unwrap();
183 merged.kind = TokenKind::Number;
184 Ok((input, RealNumber::Binary(merged)))
185}
186
187pub fn empty(input: ParseString) -> ParseResult<Token> {
189 let (input, (g, src_range)) = range(many1(tag("_")))(input)?;
190 Ok((input, Token{kind: TokenKind::Empty, chars: g.join("").chars().collect(), src_range}))
191}
192
193pub fn kind_annotation(input: ParseString) -> ParseResult<KindAnnotation> {
197 let msg2 = "Expects at least one unit in kind annotation";
198 let msg3 = "Expects right angle";
199 let (input, (_, r)) = range(left_angle)(input)?;
200 let (input, kind) = kind(input)?;
201 let (input, _) = label!(right_angle, msg3, r)(input)?;
202 Ok((input, KindAnnotation{ kind }))
203}
204
205pub fn kind(input: ParseString) -> ParseResult<Kind> {
207 let (input, kind) = alt((kind_fxn,kind_empty,kind_atom,kind_tuple,kind_scalar,kind_bracket,kind_map,kind_brace))(input)?;
208 Ok((input, kind))
209}
210
211pub fn kind_empty(input: ParseString) -> ParseResult<Kind> {
213 let (input, _) = many1(underscore)(input)?;
214 Ok((input, Kind::Empty))
215}
216
217pub fn kind_atom(input: ParseString) -> ParseResult<Kind> {
219 let (input, _) = grave(input)?;
220 let (input, atm) = identifier(input)?;
221 Ok((input, Kind::Atom(atm)))
222}
223
224pub fn kind_map(input: ParseString) -> ParseResult<Kind> {
226 let (input, _) = left_brace(input)?;
227 let (input, key_kind) = kind(input)?;
228 let (input, _) = colon(input)?;
229 let (input, value_kind) = kind(input)?;
230 let (input, _) = right_brace(input)?;
231 Ok((input, Kind::Map(Box::new(key_kind),Box::new(value_kind))))
232}
233
234pub fn kind_fxn(input: ParseString) -> ParseResult<Kind> {
236 let (input, _) = left_parenthesis(input)?;
237 let (input, input_kinds) = separated_list0(list_separator,kind)(input)?;
238 let (input, _) = right_parenthesis(input)?;
239 let (input, _) = equal(input)?;
240 let (input, _) = left_parenthesis(input)?;
241 let (input, output_kinds) = separated_list0(list_separator,kind)(input)?;
242 let (input, _) = right_parenthesis(input)?;
243 Ok((input, Kind::Function(input_kinds,output_kinds)))
244}
245
246pub fn kind_brace(input: ParseString) -> ParseResult<Kind> {
248 let (input, _) = left_brace(input)?;
249 let (input, kinds) = separated_list1(list_separator,kind)(input)?;
250 let (input, _) = right_brace(input)?;
251 let (input, _) = opt(colon)(input)?;
252 let (input, size) = separated_list0(list_separator,literal)(input)?;
253 Ok((input, Kind::Brace((kinds,size))))
254}
255
256pub fn kind_bracket(input: ParseString) -> ParseResult<Kind> {
258 let (input, _) = left_bracket(input)?;
259 let (input, kinds) = separated_list1(list_separator,kind)(input)?;
260 let (input, _) = right_bracket(input)?;
261 let (input, _) = opt(colon)(input)?;
262 let (input, size) = separated_list0(list_separator,literal)(input)?;
263 Ok((input, Kind::Bracket((kinds,size))))
264}
265
266pub fn kind_tuple(input: ParseString) -> ParseResult<Kind> {
268 let (input, _) = left_parenthesis(input)?;
269 let (input, kinds) = separated_list1(list_separator, kind)(input)?;
270 let (input, _) = right_parenthesis(input)?;
271 Ok((input, Kind::Tuple(kinds)))
272}
273
274pub fn kind_scalar(input: ParseString) -> ParseResult<Kind> {
276 let (input, kind) = identifier(input)?;
277 let (input, range) = opt(tuple((colon,range_expression)))(input)?;
278 Ok((input, Kind::Scalar(kind)))
279}