1use crate::*;
2#[cfg(feature = "no_std")]
3use core::cmp::Ordering;
4#[cfg(not(feature = "no_std"))]
5use std::cmp::Ordering;
6
7#[cfg(feature = "serde")]
8pub fn compress_and_encode<T: serde::Serialize>(tree: &T) -> Result<String, Box<dyn std::error::Error>> {
9 let serialized_code = bincode::serde::encode_to_vec(tree,bincode::config::standard())?;
10 let mut compressed = Vec::new();
11 brotli::CompressorWriter::new(&mut compressed, 9, 4096, 22)
12 .write(&serialized_code)?;
13 Ok(base64::encode(compressed))
14}
15
16#[cfg(feature = "serde")]
17pub fn decode_and_decompress<T: serde::de::DeserializeOwned>(encoded: &str) -> Result<T, Box<dyn std::error::Error>> {
18 let decoded = base64::decode(encoded)?;
19
20 let mut decompressed = Vec::new();
21 brotli::Decompressor::new(Cursor::new(decoded), 4096)
22 .read_to_end(&mut decompressed)?;
23
24 let (decoded,red) = bincode::serde::decode_from_slice(&decompressed,bincode::config::standard())?;
25
26 Ok(decoded)
27}
28#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
29#[derive(Clone, Copy, PartialEq, Eq, Hash, Ord)]
30pub struct SourceLocation {
31 pub row: usize,
32 pub col: usize,
33}
34
35impl PartialOrd for SourceLocation {
36 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
37 if self.row < other.row {
38 Some(Ordering::Less)
39 } else if self.row > other.row {
40 Some(Ordering::Greater)
41 } else {
42 self.col.partial_cmp(&other.col)
43 }
44 }
45}
46
47impl fmt::Debug for SourceLocation {
48 #[inline]
49 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
50 write!(f, "{}:{}", self.row, self.col);
51 Ok(())
52 }
53}
54
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56#[derive(Clone, Hash, PartialEq, Eq)]
57pub struct SourceRange {
58 pub start: SourceLocation,
59 pub end: SourceLocation,
60}
61
62impl Default for SourceRange {
66 fn default() -> Self {
67 SourceRange {
68 start: SourceLocation { row: 0, col: 0 },
69 end: SourceLocation { row: 0, col: 0 },
70 }
71 }
72}
73
74impl fmt::Debug for SourceRange {
75 #[inline]
76 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77 write!(f, "[{:?}, {:?})", self.start, self.end);
78 Ok(())
79 }
80}
81
82pub fn merge_src_range(r1: SourceRange, r2: SourceRange) -> SourceRange {
83 SourceRange {
84 start: r1.start.min(r2.start),
85 end: r2.end.max(r2.end),
86 }
87}
88
89pub trait Recoverable: Sized {
90 fn error_placeholder(skipped_tokens: Token, range: SourceRange) -> Self;
91}
92
93#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
95pub enum TokenKind {
96 AbstractSigil, Alpha, Ampersand, Any, Apostrophe, AssignOperator, Asterisk, AsyncTransitionOperator, At,
97 Backslash, Bar, BoxDrawing,
98 Caret, CarriageReturn, CarriageReturnNewLine, Colon, CodeBlock, Comma,
99 Dash, DefineOperator, Digit, Dollar,
100 Emoji, EmphasisSigil, Empty, Equal, EquationSigil, Error, ErrorSigil, EscapedChar, Exclamation,
101 False, FloatLeft, FloatRight, FootnotePrefix,
102 GenOperator, Grave, GraveCodeBlockSigil,
103 HashTag, HighlightSigil, HttpPrefix,
104 IdeaSigil, Identifier, ImgPrefix, InfoSigil, InlineCode,
105 LeftAngle, LeftBrace, LeftBracket, LeftParenthesis,
106 #[cfg(feature = "mika")]
107 Mika(Mika),
108 MikaSection, MikaSectionOpen, MikaSectionClose,
109 Newline, Not, Number,
110 OutputOperator,
111 Percent, Period, Plus, PromptSigil,
112 Question, QuestionSigil, Quote, QuoteSigil,
113 RightAngle, RightBrace, RightBracket, RightParenthesis,
114 SectionSigil, Semicolon, Space, Slash, String, StrikeSigil, StrongSigil, SuccessSigil, SynthOperator,
115 Tab, Text, Tilde, TildeCodeBlockSigil, Title, TransitionOperator, True,
116 UnderlineSigil, Underscore,
117 WarningSigil,
118}
119
120#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
121#[derive(Clone, Hash, PartialEq, Eq)]
122pub struct Token {
123 pub kind: TokenKind,
124 pub chars: Vec<char>,
125 pub src_range: SourceRange
126}
127
128impl fmt::Debug for Token {
129 #[inline]
130 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
131 write!(f, "{:?}:{:?}:{:?}", self.kind, String::from_iter(self.chars.iter().cloned()), self.src_range);
132 Ok(())
133 }
134}
135
136impl Default for Token {
137 fn default() -> Self {
138 Token{
139 kind: TokenKind::Empty,
140 chars: vec![],
141 src_range: SourceRange::default(),
142 }
143 }
144}
145
146impl Token {
147
148 pub fn new(kind: TokenKind, src_range: SourceRange, chars: Vec<char>) -> Token {
149 Token{kind, chars, src_range}
150 }
151
152 pub fn to_string(&self) -> String {
153 self.chars.iter().collect()
154 }
155
156 pub fn merge_tokens(tokens: &mut Vec<Token>) -> Option<Token> {
157 if tokens.len() == 0 {
158 None
159 } else if tokens.len() == 1 {
160 Some(tokens[0].clone())
161 } else {
162 let first = tokens[0].src_range.clone();
163 let kind = tokens[0].kind.clone();
164 let last = tokens.last().unwrap().src_range.clone();
165 let src_range = merge_src_range(first, last);
166 let chars: Vec<char> = tokens.iter_mut().fold(vec![],|mut m, ref mut t| {m.append(&mut t.chars.clone()); m});
167 let merged_token = Token{kind, chars, src_range};
168 Some(merged_token)
169 }
170 }
171}
172
173#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
174#[derive(Clone, Debug, Hash, PartialEq, Eq)]
175pub struct TableOfContents {
176 pub title: Option<Title>,
177 pub sections: Vec<Section>,
178}
179
180#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
181#[derive(Clone, Debug, Hash, PartialEq, Eq)]
182pub struct Program {
183 pub title: Option<Title>,
184 pub body: Body,
185}
186
187impl Program {
188 pub fn tokens(&self) -> Vec<Token> {
189 let body_tokens = self.body.tokens();
194 body_tokens
195 }
196
197 pub fn table_of_contents(&self) -> TableOfContents {
198 let mut sections = vec![];
199 for s in &self.body.sections {
200 sections.push(s.table_of_contents());
201 }
202 TableOfContents {
203 title: self.title.clone(),
204 sections,
205 }
206 }
207
208}
209
210#[cfg(feature = "pretty_print")]
211impl PrettyPrint for Program {
212fn pretty_print(&self) -> String {
213 #[cfg(feature = "serde")]
214 let json_string = serde_json::to_string_pretty(self).unwrap();
215 #[cfg(not(feature = "serde"))]
216 let json_string = "Error: Enable Serde to prettt print trees.".to_string();
217
218 let depth = |line: &str|->usize{line.chars().take_while(|&c| c == ' ').count()};
219 let mut result = String::new();
220 let lines: Vec<&str> = json_string.lines().collect();
221 result.push_str("Program\n");
222 for (index, line) in lines.iter().enumerate() {
223 let trm = line.trim();
224 if trm == "}" ||
225 trm == "},"||
226 trm == "{" ||
227 trm == "[" ||
228 trm == "],"||
229 trm == "]" {
230 continue;
231 }
232
233 let d = depth(line);
235 let mut prefix = String::new();
237 for _ in 0..d {
238 prefix.push_str(" ");
239 }
240 if index == lines.len() {
241 prefix.push_str("└ ");
242 } else {
243 if depth(lines[index + 1]) != d {
244 prefix.push_str("└ ");
245 } else {
246 prefix.push_str("├ ");
247 }
248 }
249 let trm = line.trim();
250 let trm = trm.trim_end_matches('{')
251 .trim_start_matches('"')
252 .trim_end_matches(':')
253 .trim_end_matches('"')
254 .trim_end_matches('[');
255 prefix.push_str(trm);
256
257 result.push_str(&prefix);
259 result.push('\n');
260 result = result.replace("\":", "");
261 }
262 let mut indexed_str = IndexedString::new(&result);
263 'rows: for i in 0..indexed_str.rows {
264 let rowz = &indexed_str.index_map[i];
265 for j in 0..rowz.len() {
266 let c = match indexed_str.get(i,j) {
267 Some(c) => c,
268 None => continue,
269 };
270 if c == '└' {
271 for k in i+1..indexed_str.rows {
272 match indexed_str.get(k,j) {
273 Some(c2) => {
274 if c2 == '└' {
275 indexed_str.set(i,j,'├');
276 for l in i+1..k {
277 match indexed_str.get(l,j) {
278 Some(' ') => {indexed_str.set(l,j,'│');},
279 Some('└') => {indexed_str.set(l,j,'├');},
280 _ => (),
281 }
282 }
283 } else if c2 == ' ' {
284 continue;
285 } else {
286 continue 'rows;
287 }
288 },
289 None => continue,
290 }
291
292 }
293 } else if c == ' ' || c == '│' {
294 continue;
295 } else {
296 continue 'rows;
297 }
298 }
299 }
300 indexed_str.to_string()
301 }
302}
303
304#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
305#[derive(Clone, Debug, Hash, PartialEq, Eq)]
306pub struct Title {
307 pub text: Token,
308 pub byline: Option<Paragraph>,
309}
310
311impl Title {
312
313 pub fn to_string(&self) -> String {
314 self.text.to_string()
315 }
316
317}
318
319#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
320#[derive(Clone, Debug, Hash, PartialEq, Eq)]
321pub struct Body {
322 pub sections: Vec<Section>,
323}
324
325impl Body {
326 pub fn tokens(&self) -> Vec<Token> {
327 let mut out = vec![];
328 for s in &self.sections {
329 let mut tkns = s.tokens();
330 out.append(&mut tkns);
331 }
332 out
333 }
334}
335
336#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
337#[derive(Clone, Debug, Hash, PartialEq, Eq)]
338pub enum ColumnAlignment {
339 Left,
340 Center,
341 Right,
342}
343
344#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
345#[derive(Clone, Debug, Hash, PartialEq, Eq)]
346pub struct MarkdownTable {
347 pub header: Vec<Paragraph>,
348 pub rows: Vec<Vec<Paragraph>>,
349 pub alignment: Vec<ColumnAlignment>,
350}
351
352#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
353#[derive(Clone, Debug, Hash, PartialEq, Eq)]
354pub struct Subtitle {
355 pub text: Paragraph,
356 pub level: u8,
357}
358
359impl Subtitle {
360 pub fn to_string(&self) -> String {
361 self.text.to_string()
362 }
363}
364
365#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
366#[derive(Clone, Debug, Hash, PartialEq, Eq)]
367pub struct Section {
368 pub subtitle: Option<Subtitle>,
369 pub elements: Vec<SectionElement>,
370}
371
372impl Section {
373
374 pub fn table_of_contents(&self) -> Section {
375 let elements: Vec<_> = self.elements.iter()
376 .filter(|e| matches!(e, SectionElement::Subtitle(_)))
377 .cloned()
378 .collect();
379 Section {
380 subtitle: self.subtitle.clone(),
381 elements,
382 }
383 }
384
385 pub fn tokens(&self) -> Vec<Token> {
386 let mut out = vec![];
387 for s in &self.elements {
388 let mut tkns = s.tokens();
389 out.append(&mut tkns);
390 }
391 out
392 }
393}
394
395#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
396#[derive(Clone, Debug, Hash, PartialEq, Eq)]
397pub struct Grammar {
398 pub rules: Vec<Rule>,
399}
400
401#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
402#[derive(Clone, Debug, Hash, PartialEq, Eq)]
403pub struct GrammarIdentifier {
404 pub name: Token,
405}
406
407impl GrammarIdentifier {
408 pub fn tokens(&self) -> Vec<Token> {
409 vec![self.name.clone()]
410 }
411
412 pub fn to_string(&self) -> String {
413 self.name.to_string()
414 }
415}
416
417#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
418#[derive(Clone, Debug, Hash, PartialEq, Eq)]
419pub struct Rule {
420 pub name: GrammarIdentifier,
421 pub expr: GrammarExpression,
422}
423
424#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
425#[derive(Clone, Debug, Hash, PartialEq, Eq)]
426pub enum GrammarExpression {
427 Choice(Vec<GrammarExpression>),
428 Definition(GrammarIdentifier),
429 Group(Box<GrammarExpression>),
430 List(Box<GrammarExpression>, Box<GrammarExpression>),
431 Not(Box<GrammarExpression>),
432 Optional(Box<GrammarExpression>),
433 Peek(Box<GrammarExpression>),
434 Repeat0(Box<GrammarExpression>),
435 Repeat1(Box<GrammarExpression>),
436 Range(Token,Token),
437 Sequence(Vec<GrammarExpression>),
438 Terminal(Token),
439}
440
441impl GrammarExpression {
442 pub fn tokens(&self) -> Vec<Token> {
443 match self {
444 GrammarExpression::Choice(exprs) => {
445 let mut tokens = vec![];
446 for expr in exprs {
447 tokens.append(&mut expr.tokens());
448 }
449 tokens
450 }
451 GrammarExpression::Definition(id) => id.tokens(),
452 GrammarExpression::Group(expr) => expr.tokens(),
453 GrammarExpression::List(expr1, expr2) => {
454 let mut tokens = expr1.tokens();
455 tokens.append(&mut expr2.tokens());
456 tokens
457 }
458 GrammarExpression::Not(expr) => expr.tokens(),
459 GrammarExpression::Optional(expr) => expr.tokens(),
460 GrammarExpression::Peek(expr) => expr.tokens(),
461 GrammarExpression::Repeat0(expr) => expr.tokens(),
462 GrammarExpression::Repeat1(expr) => expr.tokens(),
463 GrammarExpression::Range(t1, t2) => vec![t1.clone(), t2.clone()],
464 GrammarExpression::Sequence(exprs) => {
465 let mut tokens = vec![];
466 for expr in exprs {
467 tokens.append(&mut expr.tokens());
468 }
469 tokens
470 }
471 GrammarExpression::Terminal(t) => vec![t.clone()],
472 }
473 }
474
475
476}
477
478#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
479#[derive(Clone, Debug, Hash, PartialEq, Eq)]
480pub struct Citation {
481 pub id: Token,
482 pub text: Paragraph,
483}
484
485impl Citation {
486 pub fn to_string(&self) -> String {
487 format!("[{}]: {}", self.id.to_string(), self.text.to_string())
488 }
489}
490
491#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
493#[derive(Clone, Debug, Hash, PartialEq, Eq)]
494pub struct BlockConfig {
495 pub namespace_str: String,
496 pub namespace: u64,
497 pub disabled: bool,
498 pub hidden: bool,
499}
500
501pub type Footnote = (Token, Vec<Paragraph>);
502
503#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
504#[derive(Clone, Debug, Hash, PartialEq, Eq)]
505pub enum FloatDirection {
506 Left,
507 Right,
508}
509
510#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
511#[derive(Clone, Debug, Hash, PartialEq, Eq)]
512pub struct FencedMechCode {
513 pub code: Vec<(MechCode,Option<Comment>)>,
514 pub config: BlockConfig,
515 pub options: Option<OptionMap>,
516}
517
518#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
519#[derive(Clone, Debug, Hash, PartialEq, Eq)]
520pub enum SectionElement {
521 Abstract(Vec<Paragraph>),
522 QuoteBlock(Vec<Paragraph>),
523 InfoBlock(Vec<Paragraph>),
524 SuccessBlock(Vec<Paragraph>),
525 IdeaBlock(Vec<Paragraph>),
526 WarningBlock(Vec<Paragraph>),
527 ErrorBlock(Vec<Paragraph>),
528 QuestionBlock(Vec<Paragraph>),
529 Citation(Citation),
530 CodeBlock(Token),
531 Comment(Comment),
532 Diagram(Token),
533 Equation(Token),
534 FencedMechCode(FencedMechCode),
535 Float((Box<SectionElement>, FloatDirection)),
536 Footnote(Footnote),
537 Grammar(Grammar),
538 FigureTable(FigureTable),
539 Image(Image),
540 List(MDList),
541 MechCode(Vec<(MechCode,Option<Comment>)>),
542 #[cfg(feature = "mika")]
543 Mika((Mika, Option<MikaSection>)),
544 Paragraph(Paragraph),
545 Subtitle(Subtitle),
546 Table(MarkdownTable),
547 Prompt(Box<SectionElement>),
548 ThematicBreak,
549 Error(Token, SourceRange),
550}
551
552impl Recoverable for SectionElement {
553 fn error_placeholder(skipped_tokens: Token, range: SourceRange) -> Self {
554 SectionElement::Error(skipped_tokens, range)
555 }
556}
557
558impl SectionElement {
559
560 pub fn tokens(&self) -> Vec<Token> {
561 match self {
562 SectionElement::Prompt(prompt) => prompt.tokens(),
563 #[cfg(feature = "mika")]
564 SectionElement::Mika((mika, mika_section)) => {
565 let mut tokens = vec![];
566 tokens.append(&mut mika.tokens());
567 if let Some(mika_section) = mika_section {
568 for mika_section_element in &mika_section.elements.elements {
569 tokens.append(&mut mika_section_element.tokens());
570 }
571 }
572 tokens
573 },
574 SectionElement::FencedMechCode(c) => {
575 let mut tokens = vec![];
576 for (c, _) in &c.code {
577 tokens.append(&mut c.tokens());
578 }
579 tokens
580 }
581 SectionElement::MechCode(codes) => {
582 let mut tokens = vec![];
583 for (code, _) in codes {
584 tokens.append(&mut code.tokens());
585 }
586 tokens
587 }
588 SectionElement::Abstract(paragraphs)
589 | SectionElement::QuoteBlock(paragraphs)
590 | SectionElement::InfoBlock(paragraphs)
591 | SectionElement::SuccessBlock(paragraphs)
592 | SectionElement::IdeaBlock(paragraphs)
593 | SectionElement::WarningBlock(paragraphs)
594 | SectionElement::ErrorBlock(paragraphs)
595 | SectionElement::QuestionBlock(paragraphs) => {
596 let mut tokens = vec![];
597 for paragraph in paragraphs {
598 tokens.append(&mut paragraph.tokens());
599 }
600 tokens
601 }
602 SectionElement::Citation(citation) => citation.text.tokens(),
603 SectionElement::CodeBlock(token)
604 | SectionElement::Diagram(token)
605 | SectionElement::Equation(token) => vec![token.clone()],
606 SectionElement::Comment(comment) => comment.tokens(),
607 SectionElement::Float((element, _)) => element.tokens(),
608 SectionElement::Footnote((_, paragraphs)) => {
609 let mut tokens = vec![];
610 for paragraph in paragraphs {
611 tokens.append(&mut paragraph.tokens());
612 }
613 tokens
614 }
615 SectionElement::Grammar(grammar) => {
616 let mut tokens = vec![];
617 for rule in &grammar.rules {
618 tokens.append(&mut rule.name.tokens());
619 tokens.append(&mut rule.expr.tokens());
620 }
621 tokens
622 }
623 SectionElement::Image(image) => {
624 let mut tokens = vec![image.src.clone()];
625 if let Some(caption) = &image.caption {
626 tokens.append(&mut caption.tokens());
627 }
628 tokens
629 }
630 SectionElement::FigureTable(figure_table) => {
631 let mut tokens = vec![];
632 for row in &figure_table.rows {
633 for figure in row {
634 tokens.push(figure.src.clone());
635 tokens.append(&mut figure.caption.tokens());
636 }
637 }
638 tokens
639 }
640 SectionElement::List(list) => match list {
641 MDList::Unordered(items) => {
642 let mut tokens = vec![];
643 for ((_, paragraph), sublist) in items {
644 tokens.append(&mut paragraph.tokens());
645 if let Some(sublist) = sublist {
646 tokens.append(&mut sublist.tokens());
647 }
648 }
649 tokens
650 }
651 MDList::Ordered(ordered_list) => {
652 let mut tokens = ordered_list.start.tokens();
653 for ((_, paragraph), sublist) in &ordered_list.items {
654 tokens.append(&mut paragraph.tokens());
655 if let Some(sublist) = sublist {
656 tokens.append(&mut sublist.tokens());
657 }
658 }
659 tokens
660 }
661 MDList::Check(items) => {
662 let mut tokens = vec![];
663 for ((_, paragraph), sublist) in items {
664 tokens.append(&mut paragraph.tokens());
665 if let Some(sublist) = sublist {
666 tokens.append(&mut sublist.tokens());
667 }
668 }
669 tokens
670 }
671 },
672 SectionElement::Paragraph(paragraph) => paragraph.tokens(),
673 SectionElement::Subtitle(subtitle) => subtitle.text.tokens(),
674 SectionElement::Table(table) => {
675 let mut tokens = vec![];
676 for header in &table.header {
677 tokens.append(&mut header.tokens());
678 }
679 for row in &table.rows {
680 for column in row {
681 tokens.append(&mut column.tokens());
682 }
683 }
684 tokens
685 }
686 SectionElement::ThematicBreak => vec![],
687 SectionElement::Error(token, _) => vec![token.clone()],
688 }
689 }
690}
691
692
693#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
694#[derive(Clone, Debug, Hash, PartialEq, Eq)]
695pub struct OptionMap {
696 pub elements: Vec<(Identifier, MechString)>,
697}
698
699
700#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
701#[derive(Clone, Debug, Hash, PartialEq, Eq)]
702pub struct Image {
703 pub src: Token,
704 pub caption: Option<Paragraph>,
705 pub style: Option<OptionMap>,
706}
707
708impl Image {
709 pub fn to_string(&self) -> String {
710 let caption = match &self.caption {
711 Some(c) => c.to_string(),
712 None => "".to_string(),
713 };
714 format!("", caption, self.src.to_string())
715 }
716}
717
718#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
719#[derive(Clone, Debug, Hash, PartialEq, Eq)]
720pub struct FigureItem {
721 pub src: Token,
722 pub caption: Paragraph,
723}
724
725#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
726#[derive(Clone, Debug, Hash, PartialEq, Eq)]
727pub struct FigureTable {
728 pub rows: Vec<Vec<FigureItem>>,
729}
730
731pub type UnorderedList = Vec<((Option<Token>,Paragraph),Option<MDList>)>;
732pub type CheckList = Vec<((bool,Paragraph),Option<MDList>)>;
733
734#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
735#[derive(Clone, Debug, Hash, PartialEq, Eq)]
736pub struct OrderedList {
737 pub start: Number,
738 pub items: Vec<((Number,Paragraph),Option<MDList>)>,
739}
740
741#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
742#[derive(Clone, Debug, Hash, PartialEq, Eq)]
743pub enum MDList {
744 Unordered(UnorderedList),
745 Ordered(OrderedList),
746 Check(CheckList)
747}
748
749impl MDList {
750
751 pub fn tokens(&self) -> Vec<Token> {
752 match self {
753 MDList::Unordered(items) => {
754 let mut tokens = vec![];
755 for ((_, paragraph), sublist) in items {
756 tokens.append(&mut paragraph.tokens());
757 if let Some(sublist) = sublist {
758 tokens.append(&mut sublist.tokens());
759 }
760 }
761 tokens
762 }
763 MDList::Ordered(ordered_list) => {
764 let mut tokens = ordered_list.start.tokens();
765 for ((_, paragraph), sublist) in &ordered_list.items {
766 tokens.append(&mut paragraph.tokens());
767 if let Some(sublist) = sublist {
768 tokens.append(&mut sublist.tokens());
769 }
770 }
771 tokens
772 }
773 MDList::Check(items) => {
774 let mut tokens = vec![];
775 for ((_, paragraph), sublist) in items {
776 tokens.append(&mut paragraph.tokens());
777 if let Some(sublist) = sublist {
778 tokens.append(&mut sublist.tokens());
779 }
780 }
781 tokens
782 }
783 }
784 }
785
786}
787
788#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
789#[derive(Clone, Debug, Hash, PartialEq, Eq)]
790pub enum MechCode {
791 Comment(Comment),
792 Expression(Expression),
793 FsmImplementation(FsmImplementation),
794 FsmSpecification(FsmSpecification),
795 FunctionDefine(FunctionDefine),
796 Statement(Statement),
797 Error(Token, SourceRange),
798}
799
800impl Recoverable for MechCode {
801 fn error_placeholder(skipped_tokens: Token, range: SourceRange) -> Self {
802 MechCode::Error(skipped_tokens, range)
803 }
804}
805
806impl MechCode {
807 pub fn tokens(&self) -> Vec<Token> {
808 match self {
809 MechCode::Expression(x) => x.tokens(),
810 MechCode::Statement(x) => x.tokens(),
811 MechCode::Comment(x) => x.tokens(),
812 MechCode::FsmSpecification(x) => x.tokens(),
813 MechCode::FsmImplementation(x) => x.tokens(),
814 MechCode::FunctionDefine(_) => vec![],
815 MechCode::Error(t,_) => vec![t.clone()],
816 }
817 }
818}
819
820#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
821#[derive(Clone, Debug, Hash, PartialEq, Eq)]
822pub struct FunctionDefine {
823 pub name: Identifier,
824 pub input: Vec<FunctionArgument>,
825 pub output: Vec<FunctionArgument>,
826 pub statements: Vec<Statement>,
827 pub match_arms: Vec<FunctionMatchArm>,
828}
829
830#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
831#[derive(Clone, Debug, Hash, PartialEq, Eq)]
832pub struct FunctionMatchArm {
833 pub pattern: Pattern,
834 pub expression: Expression,
835}
836
837#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
838#[derive(Clone, Debug, Hash, PartialEq, Eq)]
839pub struct MatchArm {
840 pub pattern: Pattern,
841 pub guard: Option<Expression>,
842 pub expression: Expression,
843}
844
845#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
846#[derive(Clone, Debug, Hash, PartialEq, Eq)]
847pub struct FunctionArgument {
848 pub name: Identifier,
849 pub kind: KindAnnotation,
850}
851
852impl FunctionArgument {
853 pub fn tokens(&self) -> Vec<Token> {
854 let mut tokens = self.name.tokens();
855 tokens.append(&mut self.kind.tokens());
856 tokens
857 }
858}
859
860#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
861#[derive(Clone, Debug, Hash, PartialEq, Eq)]
862pub struct FsmImplementation {
863 pub name: Identifier,
864 pub input: Vec<Var>,
865 pub start: Pattern,
866 pub arms: Vec<FsmArm>,
867}
868
869impl FsmImplementation {
870 pub fn tokens(&self) -> Vec<Token> {
871 let mut tokens = self.name.tokens();
872 for input in &self.input {
873 tokens.append(&mut input.tokens());
874 }
875 tokens.append(&mut self.start.tokens());
876 for arm in &self.arms {
877 tokens.append(&mut arm.tokens());
878 }
879 tokens
880 }
881}
882
883#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
884#[derive(Clone, Debug, Hash, PartialEq, Eq)]
885pub enum FsmArm {
886 Guard(Pattern,Vec<Guard>),
887 Transition(Pattern,Vec<Transition>),
888 Comment(Comment),
889}
890
891impl FsmArm {
892 pub fn tokens(&self) -> Vec<Token> {
893 match self {
894 FsmArm::Guard(pattern, guards) => {
895 let mut tokens = pattern.tokens();
896 for guard in guards {
897 tokens.append(&mut guard.tokens());
898 }
899 tokens
900 }
901 FsmArm::Transition(pattern, transitions) => {
902 let mut tokens = pattern.tokens();
903 for transition in transitions {
904 tokens.append(&mut transition.tokens());
905 }
906 tokens
907 }
908 FsmArm::Comment(comment) => comment.tokens(),
909 }
910 }
911}
912
913#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
914#[derive(Clone, Debug, Hash, PartialEq, Eq)]
915pub struct Guard {
916 pub condition: Pattern,
917 pub transitions: Vec<Transition>,
918}
919
920impl Guard {
921 pub fn tokens(&self) -> Vec<Token> {
922 let mut tokens = self.condition.tokens();
923 for transition in &self.transitions {
924 tokens.append(&mut transition.tokens());
925 }
926 tokens
927 }
928}
929
930#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
931#[derive(Clone, Debug, Hash, PartialEq, Eq)]
932pub enum Transition {
933 Async(Pattern),
934 CodeBlock(Vec<(MechCode, Option<Comment>)>),
935 Next(Pattern),
936 Output(Pattern),
937 Statement(Statement),
938}
939
940impl Transition {
941 pub fn tokens(&self) -> Vec<Token> {
942 match self {
943 Transition::Async(pattern) => pattern.tokens(),
944 Transition::CodeBlock(code) => code.iter().flat_map(|(mech_code, comment)| {
945 let mut tokens = mech_code.tokens();
946 if let Some(comment) = comment {
947 tokens.append(&mut comment.tokens());
948 }
949 tokens
950 }).collect(),
951 Transition::Next(pattern) => pattern.tokens(),
952 Transition::Output(pattern) => pattern.tokens(),
953 Transition::Statement(statement) => statement.tokens(),
954 }
955 }
956}
957
958#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
959#[derive(Clone, Debug, Hash, PartialEq, Eq)]
960pub enum Pattern {
961 Expression(Expression),
962 TupleStruct(PatternTupleStruct),
963 Tuple(PatternTuple),
964 Array(PatternArray),
965 Wildcard,
966}
967
968impl Pattern {
969 pub fn tokens(&self) -> Vec<Token> {
970 match self {
971 Pattern::Expression(e) => e.tokens(),
972 Pattern::TupleStruct(ts) => ts.tokens(),
973 Pattern::Tuple(t) => t.tokens(),
974 Pattern::Array(a) => a.tokens(),
975 Pattern::Wildcard => vec![],
976 }
977 }
978}
979
980#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
981#[derive(Clone, Debug, Hash, PartialEq, Eq)]
982pub struct PatternArray {
983 pub prefix: Vec<Pattern>,
984 pub spread: Option<PatternArraySpread>,
985 pub suffix: Vec<Pattern>,
986}
987
988impl PatternArray {
989 pub fn tokens(&self) -> Vec<Token> {
990 let mut tokens = vec![];
991 for p in &self.prefix {
992 tokens.append(&mut p.tokens());
993 }
994 if let Some(spread) = &self.spread {
995 if let Some(binding) = &spread.binding {
996 tokens.append(&mut binding.tokens());
997 }
998 }
999 for p in &self.suffix {
1000 tokens.append(&mut p.tokens());
1001 }
1002 tokens
1003 }
1004}
1005
1006#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1007#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1008pub struct PatternArraySpread {
1009 pub binding: Option<Box<Pattern>>,
1010}
1011
1012#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1013#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1014pub struct PatternTupleStruct {
1015 pub name: Identifier,
1016 pub patterns: Vec<Pattern>,
1017}
1018
1019impl PatternTupleStruct {
1020 pub fn tokens(&self) -> Vec<Token> {
1021 let mut tokens = self.name.tokens();
1022 for p in &self.patterns {
1023 tokens.append(&mut p.tokens());
1024 }
1025 tokens
1026 }
1027}
1028
1029#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1030#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1031pub struct PatternTuple(pub Vec<Pattern>);
1032
1033impl PatternTuple {
1034 pub fn tokens(&self) -> Vec<Token> {
1035 let mut tokens = vec![];
1036 for p in &self.0 {
1037 tokens.append(&mut p.tokens());
1038 }
1039 tokens
1040 }
1041}
1042
1043#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1044#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1045pub struct FsmSpecification {
1046 pub name: Identifier,
1047 pub input: Vec<Var>,
1048 pub output: Option<KindAnnotation>,
1049 pub states: Vec<StateDefinition>,
1050}
1051
1052impl FsmSpecification {
1053 pub fn tokens(&self) -> Vec<Token> {
1054 let mut tokens = self.name.tokens();
1055 for var in &self.input {
1056 tokens.append(&mut var.tokens());
1057 }
1058 if let Some(output) = &self.output {
1059 tokens.append(&mut output.tokens());
1060 }
1061 for state in &self.states {
1062 tokens.append(&mut state.tokens());
1063 }
1064 tokens
1065 }
1066}
1067
1068#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1069#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1070pub struct StateDefinition {
1071 pub name: Identifier,
1072 pub state_variables: Option<Vec<Var>>,
1073}
1074
1075impl StateDefinition {
1076 pub fn tokens(&self) -> Vec<Token> {
1077 let mut tokens = self.name.tokens();
1078 if let Some(vars) = &self.state_variables {
1079 for var in vars {
1080 tokens.append(&mut var.tokens());
1081 }
1082 }
1083 tokens
1084 }
1085}
1086
1087#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1088#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1089pub enum Statement {
1090 EnumDefine(EnumDefine),
1091 FsmDeclare(FsmDeclare),
1092 KindDefine(KindDefine),
1093 OpAssign(OpAssign),
1094 VariableAssign(VariableAssign),
1095 VariableDefine(VariableDefine),
1096 TupleDestructure(TupleDestructure),
1097 SplitTable, FlattenTable, }
1100
1101impl Statement {
1102 pub fn tokens(&self) -> Vec<Token> {
1103 match self {
1104 Statement::EnumDefine(x) => x.tokens(),
1105 Statement::FsmDeclare(x) => x.tokens(),
1106 Statement::KindDefine(x) => x.tokens(),
1107 Statement::OpAssign(x) => x.tokens(),
1108 Statement::VariableAssign(x) => x.tokens(),
1109 Statement::VariableDefine(x) => x.tokens(),
1110 Statement::TupleDestructure(x) => x.tokens(),
1111 Statement::SplitTable => vec![], Statement::FlattenTable => vec![], }
1114 }
1115}
1116
1117#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1118#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1119pub struct TupleDestructure {
1120 pub vars: Vec<Identifier>,
1121 pub expression: Expression,
1122}
1123
1124impl TupleDestructure {
1125 pub fn tokens(&self) -> Vec<Token> {
1126 let mut tokens = vec![];
1127 for var in &self.vars {
1128 tokens.append(&mut var.tokens());
1129 }
1130 tokens.append(&mut self.expression.tokens());
1131 tokens
1132 }
1133}
1134
1135#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1136#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1137pub struct FsmPipe {
1138 pub start: FsmInstance,
1139 pub transitions: Vec<Transition>
1140}
1141
1142impl FsmPipe {
1143 pub fn tokens(&self) -> Vec<Token> {
1144 let mut tokens = self.start.tokens();
1145 for transition in &self.transitions {
1146 tokens.append(&mut transition.tokens());
1147 }
1148 tokens
1149 }
1150}
1151
1152#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1153#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1154pub enum PipeElement {
1155 Expression(Expression),
1156 FsmInstance(FsmInstance),
1157 Timer }
1159
1160#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1161#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1162pub struct FsmDeclare {
1163 pub fsm: Fsm,
1164 pub pipe: FsmPipe,
1165}
1166
1167impl FsmDeclare {
1168 pub fn tokens(&self) -> Vec<Token> {
1169 let mut tokens = self.fsm.tokens();
1170 tokens.append(&mut self.pipe.tokens());
1171 tokens
1172 }
1173}
1174
1175#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1176#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1177pub struct Fsm {
1178 pub name: Identifier,
1179 pub args: Option<ArgumentList>,
1180 pub kind: Option<KindAnnotation>
1181}
1182
1183impl Fsm {
1184 pub fn tokens(&self) -> Vec<Token> {
1185 let mut tokens = self.name.tokens();
1186 if let Some(args) = &self.args {
1187 for (binding, expression) in args {
1188 if let Some(binding) = binding {
1189 tokens.append(&mut binding.tokens());
1190 }
1191 tokens.append(&mut expression.tokens());
1192 }
1193 }
1194 if let Some(kind) = &self.kind {
1195 tokens.append(&mut kind.tokens());
1196 }
1197 tokens
1198 }
1199}
1200
1201pub type FsmArgs = Vec<(Option<Identifier>,Expression)>;
1202
1203#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1204#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1205pub struct FsmInstance {
1206 pub name: Identifier,
1207 pub args: Option<FsmArgs>,
1208}
1209
1210impl FsmInstance {
1211 pub fn tokens(&self) -> Vec<Token> {
1212 let mut tokens = self.name.tokens();
1213 if let Some(args) = &self.args {
1214 for (binding, expression) in args {
1215 if let Some(binding) = binding {
1216 tokens.append(&mut binding.tokens());
1217 }
1218 tokens.append(&mut expression.tokens());
1219 }
1220 }
1221 tokens
1222 }
1223}
1224
1225#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1226#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1227pub struct EnumDefine {
1228 pub name: Identifier,
1229 pub variants: Vec<EnumVariant>,
1230}
1231
1232impl EnumDefine {
1233 pub fn tokens(&self) -> Vec<Token> {
1234 let mut tokens = self.name.tokens();
1235 for v in &self.variants {
1236 tokens.append(&mut v.tokens());
1237 }
1238 tokens
1239 }
1240}
1241
1242#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1243#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1244pub struct EnumVariant {
1245 pub name: Identifier,
1246 pub value: Option<KindAnnotation>,
1247}
1248
1249impl EnumVariant {
1250 pub fn tokens(&self) -> Vec<Token> {
1251 let mut tokens = self.name.tokens();
1252 if let Some(value) = &self.value {
1253 tokens.append(&mut value.tokens());
1254 }
1255 tokens
1256 }
1257}
1258
1259#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1260#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1261pub struct KindDefine {
1262 pub name: Identifier,
1263 pub kind: KindAnnotation,
1264}
1265
1266impl KindDefine {
1267 pub fn tokens(&self) -> Vec<Token> {
1268 let mut tokens = self.name.tokens();
1269 tokens.append(&mut self.kind.tokens());
1270 tokens
1271 }
1272}
1273
1274#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1275#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1276pub struct Record {
1277 pub bindings: Vec<Binding>,
1278}
1279
1280impl Record {
1281 pub fn tokens(&self) -> Vec<Token> {
1282 let mut tkns = vec![];
1283 for b in &self.bindings {
1284 let mut t = b.tokens();
1285 tkns.append(&mut t);
1286 }
1287 tkns
1288 }
1289}
1290
1291#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1292#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1293pub enum Structure {
1294 Empty,
1295 Map(Map),
1296 Matrix(Matrix),
1297 Record(Record),
1298 Set(Set),
1299 Table(Table),
1300 Tuple(Tuple),
1301 TupleStruct(TupleStruct),
1302}
1303
1304impl Structure {
1305 pub fn tokens(&self) -> Vec<Token> {
1306 match self {
1307 Structure::Empty => vec![],
1308 Structure::Map(map) => map.tokens(),
1309 Structure::Matrix(mat) => mat.tokens(),
1310 Structure::Record(rec) => rec.tokens(),
1311 Structure::Set(set) => set.tokens(),
1312 Structure::Table(tab) => tab.tokens(),
1313 Structure::Tuple(tup) => tup.tokens(),
1314 Structure::TupleStruct(ts) => ts.tokens(),
1315 }
1316 }
1317}
1318
1319#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1320#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1321pub struct Map {
1322 pub elements: Vec<Mapping>,
1323}
1324
1325impl Map {
1326 pub fn tokens(&self) -> Vec<Token> {
1327 let mut tkns = vec![];
1328 for e in &self.elements {
1329 let mut t = e.tokens();
1330 tkns.append(&mut t);
1331 }
1332 tkns
1333 }
1334}
1335
1336#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1337#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1338pub struct Mapping {
1339 pub key: Expression,
1340 pub value: Expression,
1341}
1342
1343impl Mapping {
1344 pub fn tokens(&self) -> Vec<Token> {
1345 let mut tkns = self.key.tokens();
1346 tkns.append(&mut self.value.tokens());
1347 tkns
1348 }
1349}
1350
1351#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1352#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1353pub struct Set {
1354 pub elements: Vec<Expression>,
1355}
1356
1357impl Set {
1358 pub fn tokens(&self) -> Vec<Token> {
1359 let mut tkns = vec![];
1360 for e in &self.elements {
1361 let mut t = e.tokens();
1362 tkns.append(&mut t);
1363 }
1364 tkns
1365 }
1366}
1367
1368#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1369#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1370pub struct Atom {
1371 pub name: Identifier,
1372}
1373
1374impl Atom {
1375 pub fn tokens(&self) -> Vec<Token> {
1376 self.name.tokens()
1377 }
1378}
1379
1380#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1381#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1382pub struct TupleStruct {
1383 pub name: Identifier,
1384 pub value: Box<Expression>,
1385}
1386
1387impl TupleStruct {
1388 pub fn tokens(&self) -> Vec<Token> {
1389 let mut tkns = self.name.tokens();
1390 tkns.append(&mut self.value.tokens());
1391 tkns
1392 }
1393}
1394
1395#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1396#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1397pub struct Matrix {
1398 pub rows: Vec<MatrixRow>,
1399}
1400
1401impl Matrix {
1402 pub fn tokens(&self) -> Vec<Token> {
1403 let mut tkns = vec![];
1404 for r in &self.rows {
1405 let mut t = r.tokens();
1406 tkns.append(&mut t);
1407 }
1408 tkns
1409 }
1410}
1411
1412#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1413#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1414pub struct TableHeader(pub Vec<Field>);
1415
1416impl TableHeader {
1417 pub fn new(fields: Vec<Field>) -> TableHeader {
1418 TableHeader(fields)
1419 }
1420 pub fn tokens(&self) -> Vec<Token> {
1421 let mut tkns = vec![];
1422 for f in &self.0 {
1423 let mut t = f.tokens();
1424 tkns.append(&mut t);
1425 }
1426 tkns
1427 }
1428}
1429
1430#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1431#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1432pub struct Table {
1433 pub header: TableHeader,
1434 pub rows: Vec<TableRow>,
1435}
1436
1437impl Table {
1438 pub fn tokens(&self) -> Vec<Token> {
1439 let mut tkns = vec![];
1440 for f in &self.header.0 {
1441 let mut t = f.tokens();
1442 tkns.append(&mut t);
1443 }
1444 for r in &self.rows {
1445 let mut t = r.tokens();
1446 tkns.append(&mut t);
1447 }
1448 tkns
1449 }
1450}
1451
1452#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1453#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1454pub struct Field {
1455 pub name: Identifier,
1456 pub kind: Option<KindAnnotation>,
1457}
1458
1459impl Field {
1460 pub fn tokens(&self) -> Vec<Token> {
1461 let mut tkns = self.name.tokens();
1462 if let Some(knd) = &self.kind {
1463 let mut t = knd.tokens();
1464 tkns.append(&mut t);
1465 }
1466 tkns
1467 }
1468}
1469
1470#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1471#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1472pub struct TableColumn {
1473 pub element: Expression,
1474}
1475
1476impl TableColumn {
1477 pub fn tokens(&self) -> Vec<Token> {
1478 self.element.tokens()
1479 }
1480}
1481
1482#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1483#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1484pub struct MatrixColumn {
1485 pub element: Expression,
1486}
1487
1488impl MatrixColumn {
1489 pub fn tokens(&self) -> Vec<Token> {
1490 self.element.tokens()
1491 }
1492}
1493
1494#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1495#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1496pub struct TableRow {
1497 pub columns: Vec<TableColumn>,
1498}
1499
1500impl TableRow {
1501 pub fn tokens(&self) -> Vec<Token> {
1502 let mut tkns = vec![];
1503 for r in &self.columns {
1504 let mut t = r.element.tokens();
1505 tkns.append(&mut t);
1506 }
1507 tkns
1508 }
1509}
1510
1511#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1512#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1513pub struct MatrixRow {
1514 pub columns: Vec<MatrixColumn>,
1515}
1516
1517impl MatrixRow {
1518 pub fn tokens(&self) -> Vec<Token> {
1519 let mut tkns = vec![];
1520 for r in &self.columns {
1521 let mut t = r.tokens();
1522 tkns.append(&mut t);
1523 }
1524 tkns
1525 }
1526}
1527
1528#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1529#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1530pub struct VariableDefine {
1531 pub mutable: bool,
1532 pub var: Var,
1533 pub expression: Expression,
1534}
1535
1536impl VariableDefine {
1537 pub fn tokens(&self) -> Vec<Token> {
1538 let mut tkns = self.var.tokens();
1539 tkns.append(&mut self.expression.tokens());
1540 tkns
1541 }
1542}
1543
1544#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1545#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1546pub struct Var {
1547 pub name: Identifier,
1548 pub kind: Option<KindAnnotation>,
1549}
1550
1551impl Var {
1552 pub fn tokens(&self) -> Vec<Token> {
1553 let mut tkns = self.name.tokens();
1554 if let Some(knd) = &self.kind {
1555 let mut t = knd.tokens();
1556 tkns.append(&mut t);
1557 }
1558 tkns
1559 }
1560}
1561
1562#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1563#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1564pub struct VariableAssign {
1565 pub target: SliceRef,
1566 pub expression: Expression,
1567}
1568
1569impl VariableAssign {
1570 pub fn tokens(&self) -> Vec<Token> {
1571 let mut tkns = self.target.tokens();
1572 tkns.append(&mut self.expression.tokens());
1573 tkns
1574 }
1575}
1576
1577#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1578#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1579pub struct Identifier {
1580 pub name: Token,
1581}
1582
1583impl Identifier {
1584 pub fn tokens(&self) -> Vec<Token> {
1585 vec![self.name.clone()]
1586 }
1587
1588 pub fn to_string(&self) -> String {
1589 self.name.to_string()
1590 }
1591
1592}
1593
1594impl Identifier {
1595 pub fn hash(&self) -> u64 {
1596 hash_chars(&self.name.chars)
1597 }
1598}
1599
1600#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1601#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1602pub struct Emoji {
1603 pub tokens: Vec<Token>,
1604}
1605
1606#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1607#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1608pub struct Word {
1609 pub tokens: Vec<Token>,
1610}
1611
1612#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1613#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1614pub struct Slice {
1615 pub name: Identifier,
1616 pub subscript: Vec<Subscript>
1617}
1618
1619impl Slice {
1620 pub fn tokens(&self) -> Vec<Token> {
1621 let mut tkns = self.name.tokens();
1622 for sub in &self.subscript {
1623 let mut sub_tkns = sub.tokens();
1624 tkns.append(&mut sub_tkns);
1625 }
1626 tkns
1627 }
1628}
1629
1630#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1631#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1632pub struct SliceRef {
1633 pub name: Identifier,
1634 pub subscript: Option<Vec<Subscript>>
1635}
1636
1637impl SliceRef {
1638 pub fn tokens(&self) -> Vec<Token> {
1639 let mut tkns = self.name.tokens();
1640 if let Some(subs) = &self.subscript {
1641 for sub in subs {
1642 let mut sub_tkns = sub.tokens();
1643 tkns.append(&mut sub_tkns);
1644 }
1645 }
1646 tkns
1647 }
1648}
1649
1650#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1651#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1652pub enum Subscript {
1653 All, Brace(Vec<Subscript>), Bracket(Vec<Subscript>), Dot(Identifier), DotInt(RealNumber), Formula(Factor), Range(RangeExpression), Swizzle(Vec<Identifier>), }
1662
1663impl Subscript {
1664
1665 pub fn tokens(&self) -> Vec<Token> {
1666 match self {
1667 Subscript::All => vec![
1668 Token::new(TokenKind::Colon, SourceRange::default(), vec![':']),
1669 ],
1670 Subscript::Brace(subs) => {
1671 let mut tkns = vec![Token::new(TokenKind::LeftBrace, SourceRange::default(), vec!['{'])];
1672 for sub in subs {
1673 let mut sub_tkns = sub.tokens();
1674 tkns.append(&mut sub_tkns);
1675 }
1676 tkns.push(Token::new(TokenKind::RightBrace, SourceRange::default(), vec!['}']));
1677 tkns
1678 },
1679 Subscript::Bracket(subs) => {
1680 let mut tkns = vec![Token::new(TokenKind::LeftBracket, SourceRange::default(), vec!['['])];
1681 for sub in subs {
1682 let mut sub_tkns = sub.tokens();
1683 tkns.append(&mut sub_tkns);
1684 }
1685 tkns.push(Token::new(TokenKind::RightBracket, SourceRange::default(), vec![']']));
1686 tkns
1687 },
1688 Subscript::Dot(id) => id.tokens(),
1689 Subscript::DotInt(num) => num.tokens(),
1690 Subscript::Formula(factor) => factor.tokens(),
1691 Subscript::Range(range) => range.tokens(),
1692 Subscript::Swizzle(ids) => ids.iter().flat_map(|id| id.tokens()).collect(),
1693 }
1694 }
1695}
1696
1697#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1698#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1699pub enum Expression {
1700 Formula(Factor),
1701 FunctionCall(FunctionCall),
1702 FsmPipe(FsmPipe),
1703 Literal(Literal),
1704 Match(Box<MatchExpression>),
1705 Range(Box<RangeExpression>),
1706 Slice(Slice),
1707 Structure(Structure),
1708 SetComprehension(Box<SetComprehension>),
1709 MatrixComprehension(Box<MatrixComprehension>),
1710 Var(Var),
1711}
1712
1713impl Expression {
1714 pub fn tokens(&self) -> Vec<Token> {
1715 match self {
1716 Expression::Var(v) => v.tokens(),
1717 Expression::Literal(ltrl) => ltrl.tokens(),
1718 Expression::Structure(strct) => strct.tokens(),
1719 Expression::Formula(fctr) => fctr.tokens(),
1720 Expression::Match(match_expr) => match_expr.tokens(),
1721 Expression::Range(range) => range.tokens(),
1722 Expression::Slice(slice) => slice.tokens(),
1723 Expression::SetComprehension(sc) => sc.tokens(),
1724 Expression::FsmPipe(pipe) => pipe.tokens(),
1725 Expression::MatrixComprehension(mc) => mc.tokens(),
1726 _ => todo!(),
1727 }
1728 }
1729}
1730
1731#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1732#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1733pub struct MatchExpression {
1734 pub source: Expression,
1735 pub arms: Vec<MatchArm>,
1736}
1737
1738impl MatchExpression {
1739 pub fn tokens(&self) -> Vec<Token> {
1740 let mut tokens = self.source.tokens();
1741 for arm in &self.arms {
1742 tokens.append(&mut arm.pattern.tokens());
1743 if let Some(guard) = &arm.guard {
1744 tokens.append(&mut guard.tokens());
1745 }
1746 tokens.append(&mut arm.expression.tokens());
1747 }
1748 tokens
1749 }
1750}
1751
1752#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1753#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1754pub struct SetComprehension {
1755 pub expression: Expression,
1756 pub qualifiers: Vec<ComprehensionQualifier>,
1757}
1758
1759impl SetComprehension {
1760 pub fn tokens(&self) -> Vec<Token> {
1761 let mut tokens = self.expression.tokens();
1762 for qualifier in &self.qualifiers {
1763 tokens.append(&mut qualifier.tokens());
1764 }
1765 tokens
1766 }
1767}
1768
1769#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1770#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1771pub struct MatrixComprehension {
1772 pub expression: Expression,
1773 pub qualifiers: Vec<ComprehensionQualifier>,
1774}
1775
1776impl MatrixComprehension {
1777 pub fn tokens(&self) -> Vec<Token> {
1778 let mut tokens = self.expression.tokens();
1779 for qualifier in &self.qualifiers {
1780 tokens.append(&mut qualifier.tokens());
1781 }
1782 tokens
1783 }
1784}
1785
1786#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1787#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1788pub enum ComprehensionQualifier {
1789 Generator((Pattern,Expression)),
1790 Filter(Expression),
1791 Let(VariableDefine),
1792}
1793
1794impl ComprehensionQualifier {
1795 pub fn tokens(&self) -> Vec<Token> {
1796 match self {
1797 ComprehensionQualifier::Generator((pattern, expr)) => {
1798 let mut tokens = pattern.tokens();
1799 tokens.append(&mut expr.tokens());
1800 tokens
1801 }
1802 ComprehensionQualifier::Filter(expr) => expr.tokens(),
1803 ComprehensionQualifier::Let(var_def) => var_def.tokens(),
1804 }
1805 }
1806}
1807
1808pub type ArgumentList = Vec<(Option<Identifier>,Expression)>;
1809
1810#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1811#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1812pub struct FunctionCall {
1813 pub name: Identifier,
1814 pub args: ArgumentList,
1815}
1816
1817impl FunctionCall {
1818 pub fn tokens(&self) -> Vec<Token> {
1819 self.name.tokens()
1820 }
1821}
1822
1823#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1824#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1825pub struct Tuple {
1826 pub elements: Vec<Expression>
1827}
1828
1829impl Tuple {
1830 pub fn tokens(&self) -> Vec<Token> {
1831 let mut tokens = vec![];
1832 for elem in &self.elements {
1833 tokens.append(&mut elem.tokens());
1834 }
1835 tokens
1836 }
1837}
1838
1839#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1840#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1841pub struct Binding {
1842 pub name: Identifier,
1843 pub kind: Option<KindAnnotation>,
1844 pub value: Expression,
1845}
1846
1847impl Binding {
1848 pub fn tokens(&self) -> Vec<Token> {
1849 let mut tokens = self.name.tokens();
1850 if let Some(knd) = &self.kind {
1851 tokens.append(&mut knd.tokens());
1852 }
1853 tokens.append(&mut self.value.tokens());
1854 tokens
1855 }
1856}
1857
1858#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1859#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1860pub struct KindAnnotation {
1861 pub kind: Kind,
1862}
1863
1864impl KindAnnotation {
1865
1866 pub fn hash(&self) -> u64 {
1867 #[cfg(feature = "no_std")]
1868 let mut hasher = FxHasher::default();
1869 #[cfg(not(feature = "no_std"))]
1870 let mut hasher = std::collections::hash_map::DefaultHasher::new();
1871 self.kind.hash(&mut hasher);
1872 hasher.finish()
1873 }
1874
1875 pub fn tokens(&self) -> Vec<Token> {
1876 self.kind.tokens()
1877 }
1878}
1879
1880#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1881#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1882pub enum Kind {
1883 Any,
1884 Atom(Identifier),
1885 Table((Vec<(Identifier,Kind)>,Box<Literal>)),
1886 Set(Box<Kind>,Option<Box<Literal>>),
1887 Record((Vec<(Identifier,Kind)>)),
1888 Empty,
1889 Map(Box<Kind>,Box<Kind>),
1892 Matrix((Box<Kind>,Vec<Literal>)),
1893 Option(Box<Kind>),
1894 Scalar(Identifier),
1895 Tuple(Vec<Kind>),
1896 Kind(Box<Kind>),
1897}
1898
1899impl Kind {
1900 pub fn tokens(&self) -> Vec<Token> {
1901 match self {
1902 Kind::Option(x) => x.tokens(),
1903 Kind::Tuple(x) => x.iter().flat_map(|k| k.tokens()).collect(),
1904 Kind::Matrix((kind, literals)) => {
1905 let mut tokens = kind.tokens();
1906 for l in literals {
1907 tokens.append(&mut l.tokens());
1908 }
1909 tokens
1910 },
1911 Kind::Record(kinds) => {
1912 let mut tokens = vec![];
1913 for (id, kind) in kinds {
1914 tokens.append(&mut id.tokens());
1915 tokens.append(&mut kind.tokens());
1916 }
1917 tokens
1918 }
1919 Kind::Set(kind, size) => {
1920 let mut tokens = kind.tokens();
1921 if let Some(literal) = size {
1922 tokens.append(&mut literal.tokens());
1923 }
1924 tokens
1925 }
1926 Kind::Table((kinds, literal)) => {
1927 let mut tokens = vec![];
1928 for (id, kind) in kinds {
1929 tokens.append(&mut id.tokens());
1930 tokens.append(&mut kind.tokens());
1931 }
1932 tokens.append(&mut literal.tokens());
1933 tokens
1934 }
1935 Kind::Map(x, y) => x.tokens().into_iter().chain(y.tokens()).collect(),
1936 Kind::Scalar(x) => x.tokens(),
1937 Kind::Atom(x) => x.tokens(),
1938 Kind::Kind(x) => x.tokens(),
1939 Kind::Empty => vec![],
1940 Kind::Any => vec![],
1941 }
1942 }
1943}
1944
1945#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1946#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1947pub enum Literal {
1948 Atom(Atom),
1949 Boolean(Token),
1950 Empty(Token),
1951 Number(Number),
1952 String(MechString),
1953 Kind(Kind),
1954 TypedLiteral((Box<Literal>,KindAnnotation))
1955}
1956
1957impl Literal {
1958 pub fn tokens(&self) -> Vec<Token> {
1959 match self {
1960 Literal::Atom(atm) => atm.name.tokens(),
1961 Literal::Boolean(tkn) => vec![tkn.clone()],
1962 Literal::Number(x) => x.tokens(),
1963 Literal::String(strng) => vec![strng.text.clone()],
1964 Literal::Empty(tkn) => vec![tkn.clone()],
1965 Literal::Kind(knd) => knd.tokens(),
1966 Literal::TypedLiteral((lit, knd)) => {
1967 let mut tokens = lit.tokens();
1968 tokens.append(&mut knd.tokens());
1969 tokens
1970 }
1971 }
1972 }
1973}
1974
1975#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1976#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1977pub struct MechString {
1978 pub text: Token,
1979}
1980
1981impl MechString {
1982 pub fn to_string(&self) -> String {
1983 self.text.to_string()
1984 }
1985}
1986
1987pub type Hyperlink = (Paragraph, Token);
1988
1989#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1990#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1991pub enum ParagraphElement {
1992 Emphasis(Box<ParagraphElement>),
1993 FootnoteReference(Token),
1994 Highlight(Box<ParagraphElement>),
1995 Hyperlink(Hyperlink),
1996 InlineCode(Token),
1997 EvalInlineMechCode(Expression),
1998 InlineMechCode(MechCode),
1999 InlineEquation(Token),
2000 Reference(Token),
2001 SectionReference(Token),
2002 Strikethrough(Box<ParagraphElement>),
2003 Strong(Box<ParagraphElement>),
2004 Text(Token),
2005 Underline(Box<ParagraphElement>),
2006 Error(Token, SourceRange),
2007}
2008
2009impl Recoverable for ParagraphElement {
2010 fn error_placeholder(skipped_tokens: Token, range: SourceRange) -> Self {
2011 ParagraphElement::Error(skipped_tokens, range)
2012 }
2013}
2014
2015impl ParagraphElement {
2016
2017 pub fn tokens(&self) -> Vec<Token> {
2018 match self {
2019 ParagraphElement::Emphasis(t) => t.tokens(),
2020 ParagraphElement::FootnoteReference(t) => vec![t.clone()],
2021 ParagraphElement::Highlight(t) => t.tokens(),
2022 ParagraphElement::Hyperlink((t, u)) => {
2023 let mut tokens = t.tokens();
2024 tokens.push(u.clone());
2025 tokens
2026 },
2027 ParagraphElement::InlineCode(t) => vec![t.clone()],
2028 ParagraphElement::InlineEquation(t) => vec![t.clone()],
2029 ParagraphElement::InlineMechCode(t) => t.tokens(),
2030 ParagraphElement::EvalInlineMechCode(t) => t.tokens(),
2031 ParagraphElement::Reference(t) => vec![t.clone()],
2032 ParagraphElement::SectionReference(t) => vec![t.clone()],
2033 ParagraphElement::Strikethrough(t) => t.tokens(),
2034 ParagraphElement::Strong(t) => t.tokens(),
2035 ParagraphElement::Text(t) => vec![t.clone()],
2036 ParagraphElement::Underline(t) => t.tokens(),
2037 ParagraphElement::Error(t, _) => vec![t.clone()],
2038 }
2039 }
2040
2041 pub fn to_string(&self) -> String {
2042 match self {
2043 ParagraphElement::Emphasis(t) => t.to_string(),
2044 ParagraphElement::FootnoteReference(t) => t.to_string(),
2045 ParagraphElement::Highlight(t) => t.to_string(),
2046 ParagraphElement::Hyperlink((t, u)) => {
2047 format!("[{}]({})", t.to_string(), u.to_string())
2048 }
2049 ParagraphElement::InlineCode(t) => t.to_string(),
2050 ParagraphElement::InlineEquation(t) => t.to_string(),
2051 ParagraphElement::InlineMechCode(t) => format!("{:?}", t),
2052 ParagraphElement::EvalInlineMechCode(t) => format!("{:?}", t),
2053 ParagraphElement::Reference(t) => t.to_string(),
2054 ParagraphElement::SectionReference(t) => t.to_string(),
2055 ParagraphElement::Strikethrough(t) => t.to_string(),
2056 ParagraphElement::Strong(t) => t.to_string(),
2057 ParagraphElement::Text(t) => t.to_string(),
2058 ParagraphElement::Underline(t) => t.to_string(),
2059 ParagraphElement::Error(t, s) => format!("{{ERROR: {} at {:?}}}", t.to_string(), s),
2060 }
2061 }
2062
2063}
2064
2065#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2066#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2067pub struct Paragraph {
2068 pub elements: Vec<ParagraphElement>,
2069 pub error_range: Option<SourceRange>,
2070}
2071
2072impl Paragraph {
2073 pub fn to_string(&self) -> String {
2074 let mut out = "".to_string();
2075 for e in &self.elements {
2076 out.push_str(&e.to_string());
2077 }
2078 out
2079 }
2080
2081 pub fn from_tokens(tokens: Vec<Token>) -> Paragraph {
2082 let elements = tokens.into_iter().map(|t| ParagraphElement::Text(t)).collect();
2083 Paragraph {
2084 elements,
2085 error_range: None,
2086 }
2087 }
2088
2089 pub fn has_errors(&self) -> bool {
2090 self.error_range.is_some()
2091 }
2092
2093 pub fn tokens(&self) -> Vec<Token> {
2094 let mut tkns = vec![];
2095 for e in &self.elements {
2096 let mut e_tkns = e.tokens();
2097 tkns.append(&mut e_tkns);
2098 }
2099 tkns
2100 }
2101
2102}
2103
2104impl Recoverable for Paragraph {
2105 fn error_placeholder(skipped_tokens: Token, range: SourceRange) -> Self {
2106 Paragraph {
2107 elements: vec![ParagraphElement::Text(Token::new(TokenKind::Error, range.clone(), skipped_tokens.chars.clone()))],
2108 error_range: Some(range),
2109 }
2110 }
2111}
2112
2113
2114pub type Sign = bool;
2115pub type Numerator = Token;
2116pub type Denominator = Token;
2117pub type Whole = Token;
2118pub type Part = Token;
2119pub type Real = Box<Number>;
2120pub type Imaginary = Box<Number>;
2121pub type Base = (Whole, Part);
2122pub type Exponent = (Sign, Whole, Part);
2123
2124#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2125#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2126pub enum Number {
2127 Real(RealNumber),
2128 Complex(C64Node),
2129}
2130
2131impl Number {
2132
2133 pub fn from_integer(x: i64) -> Number {
2134 Number::Real(RealNumber::Integer(Token::new(TokenKind::Digit, SourceRange::default(), x.to_string().chars().collect())))
2135 }
2136
2137 pub fn to_string(&self) -> String {
2138 match self {
2139 Number::Real(x) => x.to_string(),
2140 Number::Complex(x) => x.to_string(),
2141 }
2142 }
2143
2144 pub fn tokens(&self) -> Vec<Token> {
2145 match self {
2146 Number::Real(x) => x.tokens(),
2147 Number::Complex(x) => x.tokens(),
2148 }
2149 }
2150}
2151
2152#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2153#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2154pub enum RealNumber {
2155 Binary(Token),
2156 Decimal(Token),
2157 Float((Whole,Part)),
2158 Hexadecimal(Token),
2159 Integer(Token),
2160 TypedInteger((Token,KindAnnotation)),
2161 Negated(Box<RealNumber>),
2162 Octal(Token),
2163 Rational((Numerator,Denominator)),
2164 Scientific((Base,Exponent)),
2165}
2166
2167impl RealNumber {
2168 pub fn tokens(&self) -> Vec<Token> {
2169 match self {
2170 RealNumber::Integer(tkn) => vec![tkn.clone()],
2171 RealNumber::TypedInteger((tkn, _)) => vec![tkn.clone()],
2172 RealNumber::Float((whole, part)) => vec![whole.clone(), part.clone()],
2173 RealNumber::Binary(tkn) => vec![tkn.clone()],
2174 RealNumber::Hexadecimal(tkn) => vec![tkn.clone()],
2175 RealNumber::Octal(tkn) => vec![tkn.clone()],
2176 RealNumber::Decimal(tkn) => vec![tkn.clone()],
2177 RealNumber::Rational((num, den)) => vec![num.clone(), den.clone()],
2178 RealNumber::Scientific(((whole,part), exponent)) => {
2179 let mut tokens = vec![whole.clone(), part.clone()];
2180 let (sign, whole_exp, part_exp) = exponent;
2181 tokens.push(Token::new(TokenKind::Plus, SourceRange::default(), if *sign { vec!['+'] } else { vec!['-'] }));
2182 tokens.push(whole_exp.clone());
2183 tokens.push(part_exp.clone());
2184 tokens
2185 }
2186 RealNumber::Negated(x) => {
2187 let mut tokens = vec![Token::new(TokenKind::Dash, SourceRange::default(), vec!['-'])];
2188 tokens.append(&mut x.tokens());
2189 tokens
2190 }
2191 }
2192 }
2193 pub fn to_string(&self) -> String {
2194 match self {
2195 RealNumber::Integer(tkn) => tkn.to_string(),
2196 RealNumber::Float((whole, part)) => format!("{}.{}", whole.to_string(), part.to_string()),
2197 RealNumber::Binary(tkn) => format!("0b{}", tkn.to_string()),
2198 RealNumber::Hexadecimal(tkn) => format!("0x{}", tkn.to_string()),
2199 RealNumber::Octal(tkn) => format!("0o{}", tkn.to_string()),
2200 RealNumber::Decimal(tkn) => format!("0d{}", tkn.to_string()),
2201 RealNumber::Rational((num, den)) => format!("{}/{}", num.to_string(), den.to_string()),
2202 RealNumber::Scientific(((whole,part), exponent)) => {
2203 let (sign, whole, part) = exponent;
2204 let sign_str = if *sign { "+" } else { "-" };
2205 let whole_str = whole.to_string();
2206 let part_str = part.to_string();
2207 format!("{}{}.{}/10^{}", whole.to_string(), part.to_string(), sign_str, whole_str)
2208 }
2209 RealNumber::TypedInteger((tkn, kind)) => format!("{}{}", tkn.to_string(), kind.kind.tokens().iter().map(|t| t.to_string()).collect::<String>()),
2210 RealNumber::Negated(x) => format!("-{}", x.to_string()),
2211 }
2212 }
2213}
2214
2215#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2216#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2217pub struct ImaginaryNumber {
2218 pub number: RealNumber,
2219}
2220
2221#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2222#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2223pub struct C64Node {
2224 pub real: Option<RealNumber>,
2225 pub imaginary: ImaginaryNumber
2226}
2227
2228impl C64Node {
2229 pub fn tokens(&self) -> Vec<Token> {
2230 let mut tkns = vec![];
2231 if let Some(r) = &self.real {
2232 tkns.append(&mut r.tokens());
2233 }
2234 tkns.append(&mut self.imaginary.number.tokens());
2235 tkns
2236 }
2237
2238 pub fn to_string(&self) -> String {
2239 let mut out = "".to_string();
2240 if let Some(r) = &self.real {
2241 out.push_str(&r.to_string());
2242 }
2243 out.push_str("i");
2244 out
2245 }
2246}
2247
2248#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2249#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2250pub struct Comment {
2251 pub paragraph: Paragraph,
2252}
2253
2254impl Comment {
2255 pub fn tokens(&self) -> Vec<Token> {
2256 self.paragraph.tokens()
2257 }
2258}
2259
2260#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2261#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2262pub struct OpAssign {
2263 pub target: SliceRef,
2264 pub op: OpAssignOp,
2265 pub expression: Expression,
2266}
2267
2268impl OpAssign {
2269 pub fn tokens(&self) -> Vec<Token> {
2270 let mut tkns = self.target.tokens();
2271 tkns.append(&mut self.op.tokens());
2272 tkns.append(&mut self.expression.tokens());
2273 tkns
2274 }
2275}
2276
2277#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2278#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2279pub enum OpAssignOp {
2280 Add,
2281 Div,
2282 Exp,
2283 Mod,
2284 Mul,
2285 Sub,
2286}
2287
2288impl OpAssignOp {
2289 pub fn tokens(&self) -> Vec<Token> {
2290 match self {
2291 OpAssignOp::Add => vec![Token::new(TokenKind::Plus, SourceRange::default(), vec!['+'])],
2292 OpAssignOp::Div => vec![Token::new(TokenKind::Slash, SourceRange::default(), vec!['/'])],
2293 OpAssignOp::Exp => vec![Token::new(TokenKind::Caret, SourceRange::default(), vec!['^'])],
2294 OpAssignOp::Mod => vec![Token::new(TokenKind::Percent, SourceRange::default(), vec!['%'])],
2295 OpAssignOp::Mul => vec![Token::new(TokenKind::Asterisk, SourceRange::default(), vec!['*'])],
2296 OpAssignOp::Sub => vec![Token::new(TokenKind::Dash, SourceRange::default(), vec!['-'])],
2297 }
2298 }
2299}
2300
2301#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2302#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2303pub enum RangeOp {
2304 Exclusive,
2305 Inclusive,
2306}
2307
2308#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2309#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2310pub enum AddSubOp {
2311 Add,
2312 Sub,
2313}
2314
2315#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2316#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2317pub enum MulDivOp {
2318 Div,
2319 Mod,
2320 Mul,
2321}
2322
2323#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2324#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2325pub enum VecOp {
2326 Cross,
2327 Dot,
2328 MatMul,
2329 Solve,
2330}
2331
2332#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2333#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2334pub enum PowerOp {
2335 Pow
2336}
2337
2338#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2339#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2340pub enum ComparisonOp {
2341 Equal,
2342 GreaterThan,
2343 GreaterThanEqual,
2344 LessThan,
2345 LessThanEqual,
2346 NotEqual,
2347 StrictEqual,
2348 StrictNotEqual,
2349}
2350
2351#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2352#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2353pub enum LogicOp {
2354 And,
2355 Not,
2356 Or,
2357 Xor,
2358}
2359
2360#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2361#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2362pub enum FormulaOperator {
2363 AddSub(AddSubOp),
2364 Comparison(ComparisonOp),
2365 Power(PowerOp),
2366 Logic(LogicOp),
2367 MulDiv(MulDivOp),
2368 Vec(VecOp),
2369 Table(TableOp),
2370 Set(SetOp),
2371}
2372
2373#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2374#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2375pub enum TableOp {
2376 InnerJoin,
2377 LeftOuterJoin,
2378 RightOuterJoin ,
2379 FullOuterJoin ,
2380 LeftSemiJoin,
2381 LeftAntiJoin,
2382}
2383
2384#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2385#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2386pub enum SetOp {
2387 Union,
2388 Intersection,
2389 Difference,
2390 Complement,
2391 ElementOf,
2392 NotElementOf,
2393 ProperSubset,
2394 ProperSuperset,
2395 Subset,
2396 Superset,
2397 SymmetricDifference,
2398}
2399
2400#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2401#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2402pub struct RangeExpression {
2403 pub start: Factor,
2404 pub increment: Option<(RangeOp,Factor)>,
2405 pub operator: RangeOp,
2406 pub terminal: Factor,
2407}
2408
2409impl RangeExpression {
2410 pub fn tokens(&self) -> Vec<Token> {
2411 let mut tokens = self.start.tokens();
2412 tokens.append(&mut self.terminal.tokens());
2413 tokens
2414 }
2415}
2416
2417#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2418#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2419pub struct Term {
2420 pub lhs: Factor,
2421 pub rhs: Vec<(FormulaOperator,Factor)>
2422}
2423
2424impl Term {
2425 pub fn tokens(&self) -> Vec<Token> {
2426 let mut lhs_tkns = self.lhs.tokens();
2427 let mut rhs_tkns = vec![];
2428 for (op, r) in &self.rhs {
2429 let mut tkns = r.tokens();
2430 rhs_tkns.append(&mut tkns);
2431 }
2432 lhs_tkns.append(&mut rhs_tkns);
2433 lhs_tkns
2434 }
2435}
2436
2437#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2438#[derive(Clone, Debug, Hash, PartialEq, Eq)]
2439pub enum Factor {
2440 Expression(Box<Expression>),
2441 Negate(Box<Factor>),
2442 Not(Box<Factor>),
2443 Parenthetical(Box<Factor>),
2444 Term(Box<Term>),
2445 Transpose(Box<Factor>),
2446}
2447
2448impl Factor {
2449 pub fn tokens(&self) -> Vec<Token> {
2450 match self {
2451 Factor::Expression(x) => x.tokens(),
2452 Factor::Negate(x) => x.tokens(),
2453 Factor::Not(x) => x.tokens(),
2454 Factor::Parenthetical(x) => x.tokens(),
2455 Factor::Term(x) => x.tokens(),
2456 Factor::Transpose(x) => x.tokens(),
2457 }
2458 }
2459}