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#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
89#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
90pub enum TokenKind {
91 AbstractSigil, Alpha, Ampersand, Any, Apostrophe, AssignOperator, Asterisk, AsyncTransitionOperator, At,
92 Backslash, Bar, BoxDrawing,
93 Caret, CarriageReturn, CarriageReturnNewLine, Colon, CodeBlock, Comma,
94 Dash, DefineOperator, Digit, Dollar,
95 Emoji, EmphasisSigil, Empty, Equal, EquationSigil, Exclamation,
96 False, FloatLeft, FloatRight, FootnotePrefix,
97 Grave, GraveCodeBlockSigil,
98 HashTag, HighlightSigil, HttpPrefix,
99 Identifier, ImgPrefix, InfoSigil, InlineCode,
100 LeftAngle, LeftBrace, LeftBracket, LeftParenthesis,
101 Newline, Not, Number,
102 OutputOperator,
103 Percent, Period, Plus,
104 Question, QuestionSigil, Quote, QuoteSigil,
105 RightAngle, RightBrace, RightBracket, RightParenthesis,
106 SectionSigil, Semicolon, Space, Slash, String, StrikeSigil, StrongSigil,
107 Tab, Text, Tilde, TildeCodeBlockSigil, Title, TransitionOperator, True,
108 UnderlineSigil, Underscore,
109}
110
111#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
112#[derive(Clone, Hash, PartialEq, Eq)]
113pub struct Token {
114 pub kind: TokenKind,
115 pub chars: Vec<char>,
116 pub src_range: SourceRange
117}
118
119impl fmt::Debug for Token {
120 #[inline]
121 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
122 write!(f, "{:?}:{:?}:{:?}", self.kind, String::from_iter(self.chars.iter().cloned()), self.src_range);
123 Ok(())
124 }
125}
126
127impl Default for Token {
128 fn default() -> Self {
129 Token{
130 kind: TokenKind::Empty,
131 chars: vec![],
132 src_range: SourceRange::default(),
133 }
134 }
135}
136
137impl Token {
138
139 pub fn new(kind: TokenKind, src_range: SourceRange, chars: Vec<char>) -> Token {
140 Token{kind, chars, src_range}
141 }
142
143 pub fn to_string(&self) -> String {
144 self.chars.iter().collect()
145 }
146
147 pub fn merge_tokens(tokens: &mut Vec<Token>) -> Option<Token> {
148 if tokens.len() == 0 {
149 None
150 } else if tokens.len() == 1 {
151 Some(tokens[0].clone())
152 } else {
153 let first = tokens[0].src_range.clone();
154 let kind = tokens[0].kind.clone();
155 let last = tokens.last().unwrap().src_range.clone();
156 let src_range = merge_src_range(first, last);
157 let chars: Vec<char> = tokens.iter_mut().fold(vec![],|mut m, ref mut t| {m.append(&mut t.chars.clone()); m});
158 let merged_token = Token{kind, chars, src_range};
159 Some(merged_token)
160 }
161 }
162}
163
164#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
165#[derive(Clone, Debug, Hash, PartialEq, Eq)]
166pub struct TableOfContents {
167 pub title: Option<Title>,
168 pub sections: Vec<Section>,
169}
170
171#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
172#[derive(Clone, Debug, Hash, PartialEq, Eq)]
173pub struct Program {
174 pub title: Option<Title>,
175 pub body: Body,
176}
177
178impl Program {
179 pub fn tokens(&self) -> Vec<Token> {
180 let body_tokens = self.body.tokens();
185 body_tokens
186 }
187
188 pub fn table_of_contents(&self) -> TableOfContents {
189 let mut sections = vec![];
190 for s in &self.body.sections {
191 sections.push(s.table_of_contents());
192 }
193 TableOfContents {
194 title: self.title.clone(),
195 sections,
196 }
197 }
198
199}
200
201#[cfg(feature = "pretty_print")]
202impl PrettyPrint for Program {
203fn pretty_print(&self) -> String {
204 #[cfg(feature = "serde")]
205 let json_string = serde_json::to_string_pretty(self).unwrap();
206 #[cfg(not(feature = "serde"))]
207 let json_string = "Error: Enable Serde to prettt print trees.".to_string();
208
209 let depth = |line: &str|->usize{line.chars().take_while(|&c| c == ' ').count()};
210 let mut result = String::new();
211 let lines: Vec<&str> = json_string.lines().collect();
212 result.push_str("Program\n");
213 for (index, line) in lines.iter().enumerate() {
214 let trm = line.trim();
215 if trm == "}" ||
216 trm == "},"||
217 trm == "{" ||
218 trm == "[" ||
219 trm == "],"||
220 trm == "]" {
221 continue;
222 }
223
224 let d = depth(line);
226 let mut prefix = String::new();
228 for _ in 0..d {
229 prefix.push_str(" ");
230 }
231 if index == lines.len() {
232 prefix.push_str("└ ");
233 } else {
234 if depth(lines[index + 1]) != d {
235 prefix.push_str("└ ");
236 } else {
237 prefix.push_str("├ ");
238 }
239 }
240 let trm = line.trim();
241 let trm = trm.trim_end_matches('{')
242 .trim_start_matches('"')
243 .trim_end_matches(':')
244 .trim_end_matches('"')
245 .trim_end_matches('[');
246 prefix.push_str(trm);
247
248 result.push_str(&prefix);
250 result.push('\n');
251 result = result.replace("\":", "");
252 }
253 let mut indexed_str = IndexedString::new(&result);
254 'rows: for i in 0..indexed_str.rows {
255 let rowz = &indexed_str.index_map[i];
256 for j in 0..rowz.len() {
257 let c = match indexed_str.get(i,j) {
258 Some(c) => c,
259 None => continue,
260 };
261 if c == '└' {
262 for k in i+1..indexed_str.rows {
263 match indexed_str.get(k,j) {
264 Some(c2) => {
265 if c2 == '└' {
266 indexed_str.set(i,j,'├');
267 for l in i+1..k {
268 match indexed_str.get(l,j) {
269 Some(' ') => {indexed_str.set(l,j,'│');},
270 Some('└') => {indexed_str.set(l,j,'├');},
271 _ => (),
272 }
273 }
274 } else if c2 == ' ' {
275 continue;
276 } else {
277 continue 'rows;
278 }
279 },
280 None => continue,
281 }
282
283 }
284 } else if c == ' ' || c == '│' {
285 continue;
286 } else {
287 continue 'rows;
288 }
289 }
290 }
291 indexed_str.to_string()
292 }
293}
294
295#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
296#[derive(Clone, Debug, Hash, PartialEq, Eq)]
297pub struct Title {
298 pub text: Token,
299}
300
301impl Title {
302
303 pub fn to_string(&self) -> String {
304 self.text.to_string()
305 }
306
307}
308
309#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
310#[derive(Clone, Debug, Hash, PartialEq, Eq)]
311pub struct Body {
312 pub sections: Vec<Section>,
313}
314
315impl Body {
316 pub fn tokens(&self) -> Vec<Token> {
317 let mut out = vec![];
318 for s in &self.sections {
319 let mut tkns = s.tokens();
320 out.append(&mut tkns);
321 }
322 out
323 }
324}
325
326#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
327#[derive(Clone, Debug, Hash, PartialEq, Eq)]
328pub enum ColumnAlignment {
329 Left,
330 Center,
331 Right,
332}
333
334#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
335#[derive(Clone, Debug, Hash, PartialEq, Eq)]
336pub struct MarkdownTable {
337 pub header: Vec<Paragraph>,
338 pub rows: Vec<Vec<Paragraph>>,
339 pub alignment: Vec<ColumnAlignment>,
340}
341
342#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
343#[derive(Clone, Debug, Hash, PartialEq, Eq)]
344pub struct Subtitle {
345 pub text: Paragraph,
346 pub level: u8,
347}
348
349impl Subtitle {
350 pub fn to_string(&self) -> String {
351 self.text.to_string()
352 }
353}
354
355#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
356#[derive(Clone, Debug, Hash, PartialEq, Eq)]
357pub struct Section {
358 pub subtitle: Option<Subtitle>,
359 pub elements: Vec<SectionElement>,
360}
361
362impl Section {
363
364 pub fn table_of_contents(&self) -> Section {
365 let elements: Vec<_> = self.elements.iter()
366 .filter(|e| matches!(e, SectionElement::Subtitle(_)))
367 .cloned()
368 .collect();
369 Section {
370 subtitle: self.subtitle.clone(),
371 elements,
372 }
373 }
374
375 pub fn tokens(&self) -> Vec<Token> {
376 let mut out = vec![];
377 for s in &self.elements {
378 let mut tkns = s.tokens();
379 out.append(&mut tkns);
380 }
381 out
382 }
383}
384
385#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
386#[derive(Clone, Debug, Hash, PartialEq, Eq)]
387pub struct Grammar {
388 pub rules: Vec<Rule>,
389}
390
391#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
392#[derive(Clone, Debug, Hash, PartialEq, Eq)]
393pub struct GrammarIdentifier {
394 pub name: Token,
395}
396
397impl GrammarIdentifier {
398 pub fn tokens(&self) -> Vec<Token> {
399 vec![self.name.clone()]
400 }
401
402 pub fn to_string(&self) -> String {
403 self.name.to_string()
404 }
405}
406
407#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
408#[derive(Clone, Debug, Hash, PartialEq, Eq)]
409pub struct Rule {
410 pub name: GrammarIdentifier,
411 pub expr: GrammarExpression,
412}
413
414#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
415#[derive(Clone, Debug, Hash, PartialEq, Eq)]
416pub enum GrammarExpression {
417 Choice(Vec<GrammarExpression>),
418 Definition(GrammarIdentifier),
419 Group(Box<GrammarExpression>),
420 List(Box<GrammarExpression>, Box<GrammarExpression>),
421 Not(Box<GrammarExpression>),
422 Optional(Box<GrammarExpression>),
423 Peek(Box<GrammarExpression>),
424 Repeat0(Box<GrammarExpression>),
425 Repeat1(Box<GrammarExpression>),
426 Range(Token,Token),
427 Sequence(Vec<GrammarExpression>),
428 Terminal(Token),
429}
430
431#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
432#[derive(Clone, Debug, Hash, PartialEq, Eq)]
433pub struct Citation {
434 pub id: Token,
435 pub text: Paragraph,
436}
437
438impl Citation {
439 pub fn to_string(&self) -> String {
440 format!("[{}]: {}", self.id.to_string(), self.text.to_string())
441 }
442}
443
444#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
446#[derive(Clone, Debug, Hash, PartialEq, Eq)]
447pub struct BlockConfig {
448 pub namespace: u64,
449 pub disabled: bool,
450 pub hidden: bool,
451}
452
453pub type Footnote = (Token, Paragraph);
454
455#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
456#[derive(Clone, Debug, Hash, PartialEq, Eq)]
457pub enum FloatDirection {
458 Left,
459 Right,
460}
461
462#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
463#[derive(Clone, Debug, Hash, PartialEq, Eq)]
464pub struct FencedMechCode {
465 pub code: Vec<(MechCode,Option<Comment>)>,
466 pub config: BlockConfig,
467 pub options: Option<OptionMap>,
468}
469
470#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
471#[derive(Clone, Debug, Hash, PartialEq, Eq)]
472pub enum SectionElement {
473 Abstract(Vec<Paragraph>),
474 QuoteBlock(Vec<Paragraph>),
475 InfoBlock(Vec<Paragraph>),
476 QuestionBlock(Vec<Paragraph>),
477 Citation(Citation),
478 CodeBlock(Token),
479 Comment(Comment),
480 Diagram(Token),
481 Equation(Token),
482 FencedMechCode(FencedMechCode),
483 Float((Box<SectionElement>, FloatDirection)),
484 Footnote(Footnote),
485 Grammar(Grammar),
486 Image(Image),
487 List(MDList),
488 MechCode(Vec<(MechCode,Option<Comment>)>),
489 Paragraph(Paragraph),
490 Subtitle(Subtitle),
491 Table(MarkdownTable),
492 ThematicBreak,
493}
494
495impl SectionElement {
496 pub fn tokens(&self) -> Vec<Token> {
497 match self {
498 SectionElement::FencedMechCode(c) => {
499 let mut tokens = vec![];
500 for (c,_) in &c.code {
501 tokens.append(&mut c.tokens());
502 }
503 tokens
504 }
505 SectionElement::MechCode(codes) => {
506 let mut tokens = vec![];
507 for (code,_) in codes {
508 tokens.append(&mut code.tokens());
509 }
510 tokens
511 },
512 _ => todo!(),
513 }
514 }
515}
516
517#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
518#[derive(Clone, Debug, Hash, PartialEq, Eq)]
519pub struct OptionMap {
520 pub elements: Vec<(Identifier, MechString)>,
521}
522
523
524#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
525#[derive(Clone, Debug, Hash, PartialEq, Eq)]
526pub struct Image {
527 pub src: Token,
528 pub caption: Option<Paragraph>,
529 pub style: Option<OptionMap>,
530}
531
532impl Image {
533 pub fn to_string(&self) -> String {
534 let caption = match &self.caption {
535 Some(c) => c.to_string(),
536 None => "".to_string(),
537 };
538 format!("", caption, self.src.to_string())
539 }
540}
541
542pub type UnorderedList = Vec<((Option<Token>,Paragraph),Option<MDList>)>;
543pub type CheckList = Vec<((bool,Paragraph),Option<MDList>)>;
544
545#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
546#[derive(Clone, Debug, Hash, PartialEq, Eq)]
547pub struct OrderedList {
548 pub start: Number,
549 pub items: Vec<((Number,Paragraph),Option<MDList>)>,
550}
551
552#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
553#[derive(Clone, Debug, Hash, PartialEq, Eq)]
554pub enum MDList {
555 Unordered(UnorderedList),
556 Ordered(OrderedList),
557 Check(CheckList)
558}
559
560#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
561#[derive(Clone, Debug, Hash, PartialEq, Eq)]
562pub enum MechCode {
563 Comment(Comment),
564 Expression(Expression),
565 FunctionDefine(FunctionDefine),
568 Statement(Statement),
569}
570
571impl MechCode {
572 pub fn tokens(&self) -> Vec<Token> {
573 match self {
574 MechCode::Expression(x) => x.tokens(),
575 MechCode::Statement(x) => x.tokens(),
576 _ => todo!(),
577 }
581 }
582}
583
584#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
585#[derive(Clone, Debug, Hash, PartialEq, Eq)]
586pub struct FunctionDefine {
587 pub name: Identifier,
588 pub input: Vec<FunctionArgument>,
589 pub output: Vec<FunctionArgument>,
590 pub statements: Vec<Statement>,
591}
592
593#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
594#[derive(Clone, Debug, Hash, PartialEq, Eq)]
595pub struct FunctionArgument {
596 pub name: Identifier,
597 pub kind: KindAnnotation,
598}
599
600impl FunctionArgument {
601 pub fn tokens(&self) -> Vec<Token> {
602 let mut tokens = self.name.tokens();
603 tokens.append(&mut self.kind.tokens());
604 tokens
605 }
606}
607
608#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
609#[derive(Clone, Debug, Hash, PartialEq, Eq)]
610pub struct FsmImplementation {
611 pub name: Identifier,
612 pub input: Vec<Identifier>,
613 pub start: Pattern,
614 pub arms: Vec<FsmArm>,
615}
616
617#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
618#[derive(Clone, Debug, Hash, PartialEq, Eq)]
619pub enum FsmArm {
620 Guard(Pattern,Vec<Guard>),
621 Transition(Pattern,Vec<Transition>),
622}
623
624#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
625#[derive(Clone, Debug, Hash, PartialEq, Eq)]
626pub struct Guard {
627 pub condition: Pattern,
628 pub transitions: Vec<Transition>,
629}
630
631#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
632#[derive(Clone, Debug, Hash, PartialEq, Eq)]
633pub enum Transition {
634 Async(Pattern),
635 CodeBlock(Vec<(MechCode, Option<Comment>)>),
636 Next(Pattern),
637 Output(Pattern),
638 Statement(Statement),
639}
640
641#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
642#[derive(Clone, Debug, Hash, PartialEq, Eq)]
643pub enum Pattern {
644 Expression(Expression),
645 Formula(Factor),
646 TupleStruct(PatternTupleStruct),
647 Wildcard,
648}
649
650#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
651#[derive(Clone, Debug, Hash, PartialEq, Eq)]
652pub struct PatternTupleStruct {
653 pub name: Identifier,
654 pub patterns: Vec<Pattern>,
655}
656
657pub type PatternTuple = Vec<Pattern>;
658
659#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
660#[derive(Clone, Debug, Hash, PartialEq, Eq)]
661pub struct FsmSpecification {
662 pub name: Identifier,
663 pub input: Vec<Var>,
664 pub output: Option<KindAnnotation>,
665 pub states: Vec<StateDefinition>,
666}
667
668#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
669#[derive(Clone, Debug, Hash, PartialEq, Eq)]
670pub struct StateDefinition {
671 pub name: Identifier,
672 pub state_variables: Option<Vec<Var>>,
673}
674
675#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
676#[derive(Clone, Debug, Hash, PartialEq, Eq)]
677pub enum Statement {
678 EnumDefine(EnumDefine),
679 KindDefine(KindDefine),
681 OpAssign(OpAssign),
682 VariableAssign(VariableAssign),
683 VariableDefine(VariableDefine),
684 TupleDestructure(TupleDestructure),
685 SplitTable, FlattenTable, }
688
689impl Statement {
690 pub fn tokens(&self) -> Vec<Token> {
691 match self {
692 Statement::EnumDefine(x) => x.tokens(),
693 Statement::KindDefine(x) => x.tokens(),
695 Statement::OpAssign(x) => x.tokens(),
696 Statement::VariableAssign(x) => x.tokens(),
697 Statement::VariableDefine(x) => x.tokens(),
698 Statement::TupleDestructure(x) => x.tokens(),
699 Statement::SplitTable => vec![], Statement::FlattenTable => vec![], }
702 }
703}
704
705#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
706#[derive(Clone, Debug, Hash, PartialEq, Eq)]
707pub struct TupleDestructure {
708 pub vars: Vec<Identifier>,
709 pub expression: Expression,
710}
711
712impl TupleDestructure {
713 pub fn tokens(&self) -> Vec<Token> {
714 let mut tokens = vec![];
715 for var in &self.vars {
716 tokens.append(&mut var.tokens());
717 }
718 tokens.append(&mut self.expression.tokens());
719 tokens
720 }
721}
722
723#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
724#[derive(Clone, Debug, Hash, PartialEq, Eq)]
725pub struct FsmPipe {
726 pub start: FsmInstance,
727 pub transitions: Vec<Transition>
728}
729
730#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
731#[derive(Clone, Debug, Hash, PartialEq, Eq)]
732pub enum PipeElement {
733 Expression(Expression),
734 FsmInstance(FsmInstance),
735 Timer }
737
738#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
739#[derive(Clone, Debug, Hash, PartialEq, Eq)]
740pub struct FsmDeclare {
741 pub fsm: Fsm,
742 pub pipe: FsmPipe,
743}
744
745#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
746#[derive(Clone, Debug, Hash, PartialEq, Eq)]
747pub struct Fsm {
748 pub name: Identifier,
749 pub args: Option<ArgumentList>,
750 pub kind: Option<KindAnnotation>
751}
752
753pub type FsmArgs = Vec<(Option<Identifier>,Expression)>;
754
755#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
756#[derive(Clone, Debug, Hash, PartialEq, Eq)]
757pub struct FsmInstance {
758 pub name: Identifier,
759 pub args: Option<FsmArgs>,
760}
761
762#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
763#[derive(Clone, Debug, Hash, PartialEq, Eq)]
764pub struct EnumDefine {
765 pub name: Identifier,
766 pub variants: Vec<EnumVariant>,
767}
768
769impl EnumDefine {
770 pub fn tokens(&self) -> Vec<Token> {
771 let mut tokens = self.name.tokens();
772 for v in &self.variants {
773 tokens.append(&mut v.tokens());
774 }
775 tokens
776 }
777}
778
779#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
780#[derive(Clone, Debug, Hash, PartialEq, Eq)]
781pub struct EnumVariant {
782 pub name: Identifier,
783 pub value: Option<KindAnnotation>,
784}
785
786impl EnumVariant {
787 pub fn tokens(&self) -> Vec<Token> {
788 let mut tokens = self.name.tokens();
789 if let Some(value) = &self.value {
790 tokens.append(&mut value.tokens());
791 }
792 tokens
793 }
794}
795
796#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
797#[derive(Clone, Debug, Hash, PartialEq, Eq)]
798pub struct KindDefine {
799 pub name: Identifier,
800 pub kind: KindAnnotation,
801}
802
803impl KindDefine {
804 pub fn tokens(&self) -> Vec<Token> {
805 let mut tokens = self.name.tokens();
806 tokens.append(&mut self.kind.tokens());
807 tokens
808 }
809}
810
811#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
812#[derive(Clone, Debug, Hash, PartialEq, Eq)]
813pub struct Record {
814 pub bindings: Vec<Binding>,
815}
816
817#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
818#[derive(Clone, Debug, Hash, PartialEq, Eq)]
819pub enum Structure {
820 Empty,
821 Map(Map),
822 Matrix(Matrix),
823 Record(Record),
824 Set(Set),
825 Table(Table),
826 Tuple(Tuple),
827 TupleStruct(TupleStruct),
828}
829
830impl Structure {
831 pub fn tokens(&self) -> Vec<Token> {
832 match self {
833 Structure::Matrix(mat) => mat.tokens(),
834 _ => todo!(),
835 }
836 }
837}
838
839#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
840#[derive(Clone, Debug, Hash, PartialEq, Eq)]
841pub struct Map {
842 pub elements: Vec<Mapping>,
843}
844
845#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
846#[derive(Clone, Debug, Hash, PartialEq, Eq)]
847pub struct Mapping {
848 pub key: Expression,
849 pub value: Expression,
850}
851
852#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
853#[derive(Clone, Debug, Hash, PartialEq, Eq)]
854pub struct Set {
855 pub elements: Vec<Expression>,
856}
857
858#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
859#[derive(Clone, Debug, Hash, PartialEq, Eq)]
860pub struct Atom {
861 pub name: Identifier,
862}
863
864#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
865#[derive(Clone, Debug, Hash, PartialEq, Eq)]
866pub struct TupleStruct {
867 pub name: Identifier,
868 pub value: Box<Expression>,
869}
870
871#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
872#[derive(Clone, Debug, Hash, PartialEq, Eq)]
873pub struct Matrix {
874 pub rows: Vec<MatrixRow>,
875}
876
877impl Matrix {
878 pub fn tokens(&self) -> Vec<Token> {
879 let mut tkns = vec![];
880 for r in &self.rows {
881 let mut t = r.tokens();
882 tkns.append(&mut t);
883 }
884 tkns
885 }
886}
887
888pub type TableHeader = Vec<Field>;
889
890#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
891#[derive(Clone, Debug, Hash, PartialEq, Eq)]
892pub struct Table {
893 pub header: TableHeader,
894 pub rows: Vec<TableRow>,
895}
896
897#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
898#[derive(Clone, Debug, Hash, PartialEq, Eq)]
899pub struct Field {
900 pub name: Identifier,
901 pub kind: Option<KindAnnotation>,
902}
903
904#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
905#[derive(Clone, Debug, Hash, PartialEq, Eq)]
906pub struct TableColumn {
907 pub element: Expression,
908}
909
910#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
911#[derive(Clone, Debug, Hash, PartialEq, Eq)]
912pub struct MatrixColumn {
913 pub element: Expression,
914}
915
916impl MatrixColumn {
917 pub fn tokens(&self) -> Vec<Token> {
918 self.element.tokens()
919 }
920}
921
922#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
923#[derive(Clone, Debug, Hash, PartialEq, Eq)]
924pub struct TableRow {
925 pub columns: Vec<TableColumn>,
926}
927
928#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
929#[derive(Clone, Debug, Hash, PartialEq, Eq)]
930pub struct MatrixRow {
931 pub columns: Vec<MatrixColumn>,
932}
933
934impl MatrixRow {
935 pub fn tokens(&self) -> Vec<Token> {
936 let mut tkns = vec![];
937 for r in &self.columns {
938 let mut t = r.tokens();
939 tkns.append(&mut t);
940 }
941 tkns
942 }
943}
944
945#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
946#[derive(Clone, Debug, Hash, PartialEq, Eq)]
947pub struct VariableDefine {
948 pub mutable: bool,
949 pub var: Var,
950 pub expression: Expression,
951}
952
953impl VariableDefine {
954 pub fn tokens(&self) -> Vec<Token> {
955 let mut tkns = self.var.tokens();
956 tkns.append(&mut self.expression.tokens());
957 tkns
958 }
959}
960
961#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
962#[derive(Clone, Debug, Hash, PartialEq, Eq)]
963pub struct Var {
964 pub name: Identifier,
965 pub kind: Option<KindAnnotation>,
966}
967
968impl Var {
969 pub fn tokens(&self) -> Vec<Token> {
970 let mut tkns = self.name.tokens();
971 if let Some(knd) = &self.kind {
972 let mut t = knd.tokens();
973 tkns.append(&mut t);
974 }
975 tkns
976 }
977}
978
979
980#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
981#[derive(Clone, Debug, Hash, PartialEq, Eq)]
982pub struct VariableAssign {
983 pub target: SliceRef,
984 pub expression: Expression,
985}
986
987impl VariableAssign {
988 pub fn tokens(&self) -> Vec<Token> {
989 let mut tkns = self.target.tokens();
990 tkns.append(&mut self.expression.tokens());
991 tkns
992 }
993}
994
995#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
996#[derive(Clone, Debug, Hash, PartialEq, Eq)]
997pub struct Identifier {
998 pub name: Token,
999}
1000
1001impl Identifier {
1002 pub fn tokens(&self) -> Vec<Token> {
1003 vec![self.name.clone()]
1004 }
1005
1006 pub fn to_string(&self) -> String {
1007 self.name.to_string()
1008 }
1009
1010}
1011
1012
1013impl Identifier {
1014 pub fn hash(&self) -> u64 {
1015 hash_chars(&self.name.chars)
1016 }
1017}
1018
1019#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1020#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1021pub struct Emoji {
1022 pub tokens: Vec<Token>,
1023}
1024
1025#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1026#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1027pub struct Word {
1028 pub tokens: Vec<Token>,
1029}
1030
1031#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1032#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1033pub struct Slice {
1034 pub name: Identifier,
1035 pub subscript: Vec<Subscript>
1036}
1037
1038impl Slice {
1039 pub fn tokens(&self) -> Vec<Token> {
1040 let mut tkns = self.name.tokens();
1041 for sub in &self.subscript {
1042 let mut sub_tkns = sub.tokens();
1043 tkns.append(&mut sub_tkns);
1044 }
1045 tkns
1046 }
1047}
1048
1049#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1050#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1051pub struct SliceRef {
1052 pub name: Identifier,
1053 pub subscript: Option<Vec<Subscript>>
1054}
1055
1056impl SliceRef {
1057 pub fn tokens(&self) -> Vec<Token> {
1058 let mut tkns = self.name.tokens();
1059 if let Some(subs) = &self.subscript {
1060 for sub in subs {
1061 let mut sub_tkns = sub.tokens();
1062 tkns.append(&mut sub_tkns);
1063 }
1064 }
1065 tkns
1066 }
1067}
1068
1069#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1070#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1071pub enum Subscript {
1072 All, Brace(Vec<Subscript>), Bracket(Vec<Subscript>), Dot(Identifier), DotInt(RealNumber), Formula(Factor), Range(RangeExpression), Swizzle(Vec<Identifier>), }
1081
1082impl Subscript {
1083
1084 pub fn tokens(&self) -> Vec<Token> {
1085 match self {
1086 Subscript::All => vec![
1087 Token::new(TokenKind::Colon, SourceRange::default(), vec![':']),
1088 ],
1089 Subscript::Brace(subs) => {
1090 let mut tkns = vec![Token::new(TokenKind::LeftBrace, SourceRange::default(), vec!['{'])];
1091 for sub in subs {
1092 let mut sub_tkns = sub.tokens();
1093 tkns.append(&mut sub_tkns);
1094 }
1095 tkns.push(Token::new(TokenKind::RightBrace, SourceRange::default(), vec!['}']));
1096 tkns
1097 },
1098 Subscript::Bracket(subs) => {
1099 let mut tkns = vec![Token::new(TokenKind::LeftBracket, SourceRange::default(), vec!['['])];
1100 for sub in subs {
1101 let mut sub_tkns = sub.tokens();
1102 tkns.append(&mut sub_tkns);
1103 }
1104 tkns.push(Token::new(TokenKind::RightBracket, SourceRange::default(), vec![']']));
1105 tkns
1106 },
1107 Subscript::Dot(id) => id.tokens(),
1108 Subscript::DotInt(num) => num.tokens(),
1109 Subscript::Formula(factor) => factor.tokens(),
1110 Subscript::Range(range) => range.tokens(),
1111 Subscript::Swizzle(ids) => ids.iter().flat_map(|id| id.tokens()).collect(),
1112 }
1113 }
1114}
1115
1116#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1117#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1118pub enum Expression {
1119 Formula(Factor),
1120 FunctionCall(FunctionCall),
1121 Literal(Literal),
1123 Range(Box<RangeExpression>),
1124 Slice(Slice),
1125 Structure(Structure),
1126 Var(Var),
1127}
1128
1129impl Expression {
1130 pub fn tokens(&self) -> Vec<Token> {
1131 match self {
1132 Expression::Var(v) => v.tokens(),
1133 Expression::Literal(ltrl) => ltrl.tokens(),
1134 Expression::Structure(strct) => strct.tokens(),
1135 Expression::Formula(fctr) => fctr.tokens(),
1136 Expression::Range(range) => range.tokens(),
1137 Expression::Slice(slice) => slice.tokens(),
1138 _ => todo!(),
1139 }
1140 }
1141}
1142
1143pub type ArgumentList = Vec<(Option<Identifier>,Expression)>;
1144
1145#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1146#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1147pub struct FunctionCall {
1148 pub name: Identifier,
1149 pub args: ArgumentList,
1150}
1151
1152impl FunctionCall {
1153 pub fn tokens(&self) -> Vec<Token> {
1154 self.name.tokens()
1155 }
1156}
1157
1158#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1159#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1160pub struct Tuple {
1161 pub elements: Vec<Expression>
1162}
1163
1164#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1165#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1166pub struct Binding {
1167 pub name: Identifier,
1168 pub kind: Option<KindAnnotation>,
1169 pub value: Expression,
1170}
1171
1172#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1173#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1174pub struct KindAnnotation {
1175 pub kind: Kind,
1176}
1177
1178impl KindAnnotation {
1179
1180 pub fn hash(&self) -> u64 {
1181 #[cfg(feature = "no_std")]
1182 let mut hasher = FxHasher::default();
1183 #[cfg(not(feature = "no_std"))]
1184 let mut hasher = std::collections::hash_map::DefaultHasher::new();
1185 self.kind.hash(&mut hasher);
1186 hasher.finish()
1187 }
1188
1189 pub fn tokens(&self) -> Vec<Token> {
1190 self.kind.tokens()
1191 }
1192}
1193
1194#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1195#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1196pub enum Kind {
1197 Any,
1198 Atom(Identifier),
1199 Table((Vec<(Identifier,Kind)>,Box<Literal>)),
1200 Set(Box<Kind>,Option<Box<Literal>>),
1201 Record((Vec<(Identifier,Kind)>)),
1202 Empty,
1203 Map(Box<Kind>,Box<Kind>),
1206 Matrix((Box<Kind>,Vec<Literal>)),
1207 Option(Box<Kind>),
1208 Scalar(Identifier),
1209 Tuple(Vec<Kind>),
1210}
1211
1212impl Kind {
1213 pub fn tokens(&self) -> Vec<Token> {
1214 match self {
1215 Kind::Option(x) => x.tokens(),
1216 Kind::Tuple(x) => x.iter().flat_map(|k| k.tokens()).collect(),
1217 Kind::Matrix((kind, literals)) => {
1218 let mut tokens = kind.tokens();
1219 for l in literals {
1220 tokens.append(&mut l.tokens());
1221 }
1222 tokens
1223 },
1224 Kind::Record(kinds) => {
1225 let mut tokens = vec![];
1226 for (id, kind) in kinds {
1227 tokens.append(&mut id.tokens());
1228 tokens.append(&mut kind.tokens());
1229 }
1230 tokens
1231 }
1232 Kind::Set(kind, size) => {
1233 let mut tokens = kind.tokens();
1234 if let Some(literal) = size {
1235 tokens.append(&mut literal.tokens());
1236 }
1237 tokens
1238 }
1239 Kind::Table((kinds, literal)) => {
1240 let mut tokens = vec![];
1241 for (id, kind) in kinds {
1242 tokens.append(&mut id.tokens());
1243 tokens.append(&mut kind.tokens());
1244 }
1245 tokens.append(&mut literal.tokens());
1246 tokens
1247 }
1248 Kind::Map(x, y) => x.tokens().into_iter().chain(y.tokens()).collect(),
1249 Kind::Scalar(x) => x.tokens(),
1250 Kind::Atom(x) => x.tokens(),
1251 Kind::Empty => vec![],
1252 Kind::Any => vec![],
1253 }
1254 }
1255}
1256
1257#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1258#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1259pub enum Literal {
1260 Atom(Atom),
1261 Boolean(Token),
1262 Empty(Token),
1263 Number(Number),
1264 String(MechString),
1265 Kind(Kind),
1266 TypedLiteral((Box<Literal>,KindAnnotation))
1267}
1268
1269impl Literal {
1270 pub fn tokens(&self) -> Vec<Token> {
1271 match self {
1272 Literal::Atom(atm) => atm.name.tokens(),
1273 Literal::Boolean(tkn) => vec![tkn.clone()],
1274 Literal::Number(x) => x.tokens(),
1275 Literal::String(strng) => vec![strng.text.clone()],
1276 Literal::Empty(tkn) => vec![tkn.clone()],
1277 Literal::Kind(knd) => knd.tokens(),
1278 Literal::TypedLiteral((lit, knd)) => {
1279 let mut tokens = lit.tokens();
1280 tokens.append(&mut knd.tokens());
1281 tokens
1282 }
1283 }
1284 }
1285}
1286
1287#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1288#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1289pub struct MechString {
1290 pub text: Token,
1291}
1292
1293impl MechString {
1294 pub fn to_string(&self) -> String {
1295 self.text.to_string()
1296 }
1297}
1298
1299pub type Hyperlink = (Token, Token);
1300
1301#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1302#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1303pub enum ParagraphElement {
1304 Emphasis(Box<ParagraphElement>),
1305 FootnoteReference(Token),
1306 Highlight(Box<ParagraphElement>),
1307 Hyperlink(Hyperlink),
1308 InlineCode(Token),
1309 EvalInlineMechCode(Expression),
1310 InlineMechCode(MechCode),
1311 InlineEquation(Token),
1312 Reference(Token),
1313 SectionReference(Token),
1314 Strikethrough(Box<ParagraphElement>),
1315 Strong(Box<ParagraphElement>),
1316 Text(Token),
1317 Underline(Box<ParagraphElement>),
1318}
1319
1320impl ParagraphElement {
1321
1322 pub fn to_string(&self) -> String {
1323 match self {
1324 ParagraphElement::Emphasis(t) => t.to_string(),
1325 ParagraphElement::FootnoteReference(t) => t.to_string(),
1326 ParagraphElement::Highlight(t) => t.to_string(),
1327 ParagraphElement::Hyperlink((t, u)) => {
1328 format!("[{}]({})", t.to_string(), u.to_string())
1329 }
1330 ParagraphElement::InlineCode(t) => t.to_string(),
1331 ParagraphElement::InlineEquation(t) => t.to_string(),
1332 ParagraphElement::InlineMechCode(t) => format!("{:?}", t),
1333 ParagraphElement::EvalInlineMechCode(t) => format!("{:?}", t),
1334 ParagraphElement::Reference(t) => t.to_string(),
1335 ParagraphElement::SectionReference(t) => t.to_string(),
1336 ParagraphElement::Strikethrough(t) => t.to_string(),
1337 ParagraphElement::Strong(t) => t.to_string(),
1338 ParagraphElement::Text(t) => t.to_string(),
1339 ParagraphElement::Underline(t) => t.to_string(),
1340 }
1341 }
1342
1343}
1344
1345#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1346#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1347pub struct Paragraph {
1348 pub elements: Vec<ParagraphElement>,
1349}
1350
1351impl Paragraph {
1352 pub fn to_string(&self) -> String {
1353 let mut out = "".to_string();
1354 for e in &self.elements {
1355 out.push_str(&e.to_string());
1356 }
1357 out
1358 }
1359}
1360
1361pub type Sign = bool;
1362pub type Numerator = Token;
1363pub type Denominator = Token;
1364pub type Whole = Token;
1365pub type Part = Token;
1366pub type Real = Box<Number>;
1367pub type Imaginary = Box<Number>;
1368pub type Base = (Whole, Part);
1369pub type Exponent = (Sign, Whole, Part);
1370
1371#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1372#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1373pub enum Number {
1374 Real(RealNumber),
1375 Complex(C64Node),
1376}
1377
1378impl Number {
1379
1380 pub fn from_integer(x: i64) -> Number {
1381 Number::Real(RealNumber::Integer(Token::new(TokenKind::Digit, SourceRange::default(), x.to_string().chars().collect())))
1382 }
1383
1384 pub fn to_string(&self) -> String {
1385 match self {
1386 Number::Real(x) => x.to_string(),
1387 Number::Complex(x) => x.to_string(),
1388 }
1389 }
1390
1391 pub fn tokens(&self) -> Vec<Token> {
1392 match self {
1393 Number::Real(x) => x.tokens(),
1394 Number::Complex(x) => x.tokens(),
1395 }
1396 }
1397}
1398
1399#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1400#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1401pub enum RealNumber {
1402 Binary(Token),
1403 Decimal(Token),
1404 Float((Whole,Part)),
1405 Hexadecimal(Token),
1406 Integer(Token),
1407 Negated(Box<RealNumber>),
1408 Octal(Token),
1409 Rational((Numerator,Denominator)),
1410 Scientific((Base,Exponent)),
1411}
1412
1413impl RealNumber {
1414 pub fn tokens(&self) -> Vec<Token> {
1415 match self {
1416 RealNumber::Integer(tkn) => vec![tkn.clone()],
1417 _ => todo!(),
1418 }
1419 }
1420 pub fn to_string(&self) -> String {
1421 match self {
1422 RealNumber::Integer(tkn) => tkn.to_string(),
1423 RealNumber::Float((whole, part)) => format!("{}.{}", whole.to_string(), part.to_string()),
1424 RealNumber::Binary(tkn) => format!("0b{}", tkn.to_string()),
1425 RealNumber::Hexadecimal(tkn) => format!("0x{}", tkn.to_string()),
1426 RealNumber::Octal(tkn) => format!("0o{}", tkn.to_string()),
1427 RealNumber::Decimal(tkn) => format!("0d{}", tkn.to_string()),
1428 RealNumber::Rational((num, den)) => format!("{}/{}", num.to_string(), den.to_string()),
1429 RealNumber::Scientific(((whole,part), exponent)) => {
1430 let (sign, whole, part) = exponent;
1431 let sign_str = if *sign { "+" } else { "-" };
1432 let whole_str = whole.to_string();
1433 let part_str = part.to_string();
1434 format!("{}{}.{}/10^{}", whole.to_string(), part.to_string(), sign_str, whole_str)
1435 }
1436 RealNumber::Negated(x) => format!("-{}", x.to_string()),
1437 }
1438 }
1439}
1440
1441#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1442#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1443pub struct ImaginaryNumber {
1444 pub number: RealNumber,
1445}
1446
1447#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1448#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1449pub struct C64Node {
1450 pub real: Option<RealNumber>,
1451 pub imaginary: ImaginaryNumber
1452}
1453
1454impl C64Node {
1455 pub fn tokens(&self) -> Vec<Token> {
1456 let mut tkns = vec![];
1457 if let Some(r) = &self.real {
1458 tkns.append(&mut r.tokens());
1459 }
1460 tkns.append(&mut self.imaginary.number.tokens());
1461 tkns
1462 }
1463
1464 pub fn to_string(&self) -> String {
1465 let mut out = "".to_string();
1466 if let Some(r) = &self.real {
1467 out.push_str(&r.to_string());
1468 }
1469 out.push_str("i");
1470 out
1471 }
1472}
1473
1474#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1475#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1476pub struct Comment {
1477 pub paragraph: Paragraph,
1478}
1479
1480#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1481#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1482pub struct OpAssign {
1483 pub target: SliceRef,
1484 pub op: OpAssignOp,
1485 pub expression: Expression,
1486}
1487
1488impl OpAssign {
1489 pub fn tokens(&self) -> Vec<Token> {
1490 let mut tkns = self.target.tokens();
1491 tkns.append(&mut self.op.tokens());
1492 tkns.append(&mut self.expression.tokens());
1493 tkns
1494 }
1495}
1496
1497#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1498#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1499pub enum OpAssignOp {
1500 Add,
1501 Div,
1502 Exp,
1503 Mod,
1504 Mul,
1505 Sub,
1506}
1507
1508impl OpAssignOp {
1509 pub fn tokens(&self) -> Vec<Token> {
1510 match self {
1511 OpAssignOp::Add => vec![Token::new(TokenKind::Plus, SourceRange::default(), vec!['+'])],
1512 OpAssignOp::Div => vec![Token::new(TokenKind::Slash, SourceRange::default(), vec!['/'])],
1513 OpAssignOp::Exp => vec![Token::new(TokenKind::Caret, SourceRange::default(), vec!['^'])],
1514 OpAssignOp::Mod => vec![Token::new(TokenKind::Percent, SourceRange::default(), vec!['%'])],
1515 OpAssignOp::Mul => vec![Token::new(TokenKind::Asterisk, SourceRange::default(), vec!['*'])],
1516 OpAssignOp::Sub => vec![Token::new(TokenKind::Dash, SourceRange::default(), vec!['-'])],
1517 }
1518 }
1519}
1520
1521#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1522#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1523pub enum RangeOp {
1524 Exclusive,
1525 Inclusive,
1526}
1527
1528#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1529#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1530pub enum AddSubOp {
1531 Add,
1532 Sub,
1533}
1534
1535#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1536#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1537pub enum MulDivOp {
1538 Div,
1539 Mod,
1540 Mul,
1541}
1542
1543#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1544#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1545pub enum VecOp {
1546 Cross,
1547 Dot,
1548 MatMul,
1549 Solve,
1550}
1551
1552#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1553#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1554pub enum ExponentOp {
1555 Exp
1556}
1557
1558#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1559#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1560pub enum ComparisonOp {
1561 Equal,
1562 GreaterThan,
1563 GreaterThanEqual,
1564 LessThan,
1565 LessThanEqual,
1566 NotEqual,
1567 StrictEqual,
1568 StrictNotEqual,
1569}
1570
1571#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1572#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1573pub enum LogicOp {
1574 And,
1575 Not,
1576 Or,
1577 Xor,
1578}
1579
1580#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1581#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1582pub enum FormulaOperator {
1583 AddSub(AddSubOp),
1584 Comparison(ComparisonOp),
1585 Exponent(ExponentOp),
1586 Logic(LogicOp),
1587 MulDiv(MulDivOp),
1588 Vec(VecOp),
1589 Table(TableOp),
1590 Set(SetOp),
1591}
1592
1593#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1594#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1595pub enum TableOp {
1596 InnerJoin,
1597 LeftOuterJoin,
1598 RightOuterJoin ,
1599 FullOuterJoin ,
1600 LeftSemiJoin,
1601 LeftAntiJoin,
1602}
1603
1604#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1605#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1606pub enum SetOp {
1607 Union,
1608 Intersection,
1609 Difference,
1610 Complement,
1611 Subset,
1612 Superset,
1613 ProperSubset,
1614 ProperSuperset,
1615 ElementOf,
1616 NotElementOf,
1617}
1618
1619#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1620#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1621pub struct RangeExpression {
1622 pub start: Factor,
1623 pub increment: Option<(RangeOp,Factor)>,
1624 pub operator: RangeOp,
1625 pub terminal: Factor,
1626}
1627
1628impl RangeExpression {
1629 pub fn tokens(&self) -> Vec<Token> {
1630 let mut tokens = self.start.tokens();
1631 tokens.append(&mut self.terminal.tokens());
1632 tokens
1633 }
1634}
1635
1636#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1637#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1638pub struct Term {
1639 pub lhs: Factor,
1640 pub rhs: Vec<(FormulaOperator,Factor)>
1641}
1642
1643impl Term {
1644 pub fn tokens(&self) -> Vec<Token> {
1645 let mut lhs_tkns = self.lhs.tokens();
1646 let mut rhs_tkns = vec![];
1647 for (op, r) in &self.rhs {
1648 let mut tkns = r.tokens();
1649 rhs_tkns.append(&mut tkns);
1650 }
1651 lhs_tkns.append(&mut rhs_tkns);
1652 lhs_tkns
1653 }
1654}
1655
1656#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1657#[derive(Clone, Debug, Hash, PartialEq, Eq)]
1658pub enum Factor {
1659 Expression(Box<Expression>),
1660 Negate(Box<Factor>),
1661 Not(Box<Factor>),
1662 Parenthetical(Box<Factor>),
1663 Term(Box<Term>),
1664 Transpose(Box<Factor>),
1665}
1666
1667impl Factor {
1668 pub fn tokens(&self) -> Vec<Token> {
1669 match self {
1670 Factor::Expression(x) => x.tokens(),
1671 Factor::Negate(x) => x.tokens(),
1672 Factor::Not(x) => x.tokens(),
1673 Factor::Parenthetical(x) => x.tokens(),
1674 Factor::Term(x) => x.tokens(),
1675 Factor::Transpose(x) => x.tokens(),
1676 }
1677 }
1678}