polymath_rs/ast/
mod.rs

1//!
2//! # AST
3//!
4//! This module contains different CSTs into a unified AST which will be used
5//! by various backends (mathml for example).
6//!
7
8pub mod predictive;
9
10use std::collections::VecDeque;
11
12use crate::tokens::Token;
13
14#[derive(Debug, Clone)]
15pub struct AST<'a> {
16    pub expressions: Expressions<'a>,
17}
18
19#[derive(Debug, Clone)]
20pub struct Expressions<'a> {
21    pub expressions: VecDeque<Expression<'a>>,
22}
23
24#[derive(Debug, Clone)]
25pub enum Expression<'a> {
26    Frac(BiExpression<'a>),
27    Sub(BiExpression<'a>),
28    Pow(BiExpression<'a>),
29    SubPow(TriExpression<'a>),
30    Group(Group<'a>),
31    Unary(Unary<'a>),
32    Binary(Binary<'a>),
33    Literal(Literal<'a>),
34    Expressions(Expressions<'a>),
35    Unit,
36}
37
38#[derive(Debug, Clone)]
39pub struct TriExpression<'a> {
40    pub expression_1: Box<Expression<'a>>,
41    pub expression_2: Box<Expression<'a>>,
42    pub expression_3: Box<Expression<'a>>,
43}
44
45#[derive(Debug, Clone)]
46pub struct BiExpression<'a> {
47    pub expression_1: Box<Expression<'a>>,
48    pub expression_2: Box<Expression<'a>>,
49}
50
51#[derive(Debug, Clone)]
52pub struct Unary<'a> {
53    pub operator: Token<'a>,
54    pub expression: Box<Expression<'a>>,
55}
56
57#[derive(Debug, Clone)]
58pub struct Binary<'a> {
59    pub operator: Token<'a>,
60    pub expression_1: Box<Expression<'a>>,
61    pub expression_2: Box<Expression<'a>>,
62}
63
64#[derive(Debug, Clone)]
65pub struct Group<'a> {
66    pub l_brace: Token<'a>,
67    pub expressions: Expressions<'a>,
68    pub r_brace: Token<'a>,
69}
70
71#[derive(Debug, Clone)]
72pub enum Literal<'a> {
73    Literal(Token<'a>), // borrow cst literals
74    Table(Table<'a>),
75}
76
77#[derive(Debug, Clone)]
78pub struct Table<'a> {
79    pub seperators: Vec<usize>,
80    pub l_brace: Token<'a>,
81    // first vec seperates tables that need seperation by a seperator
82    // second vec seperates rows
83    // third vec seperates columns
84    pub rows: Vec<TableRow<'a>>,
85    pub r_brace: Token<'a>,
86}
87
88#[derive(Debug, Clone)]
89pub struct TableRow<'a> {
90    pub cols: Vec<Expressions<'a>>,
91}