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