fips_md/parser/
expression.rs

1//! Structures relating to expressions
2
3use super::{CompileTimeConstant, Statement};
4
5/// Types of Expressions
6#[derive(Clone,PartialEq,Debug)]
7pub enum Expression {
8    /// Atomic Expression
9    Atom(Atom),
10    /// Binary Operation
11    BinaryOperation(BinaryOperation),
12    /// Function call
13    FunctionCall(FunctionCall),
14    /// Block expression
15    Block(BlockExpression),
16    /// Array indexing
17    Indexing(AtIndex),
18    /// Ad-hoc array creation (i.e. "[1,2,a,b]")
19    AdHocArray(AdHocArrayExpression)
20}
21
22/// An atomic expression
23#[derive(Clone,PartialEq,Debug)]
24pub enum Atom {
25    /// Some (yet unresolved) variable name
26    Variable(String),
27    /// Some variable with a 'namespace' (used in interaction expressions)
28    NamespaceVariable { namespace: String, name: String },
29    /// Some literal
30    Literal(Literal)
31}
32
33/// A literal
34#[derive(Clone,PartialEq,Debug)]
35pub enum Literal {
36    Double(f64),
37    Int64(i64)
38}
39
40/// An operation with two operands
41#[derive(Clone,PartialEq,Debug)]
42pub struct BinaryOperation {
43    /// Left side of operation
44    pub lhs: Box<Expression>,
45    /// Right side of operation
46    pub rhs: Box<Expression>,
47    /// Operator of operation
48    pub op: BinaryOperator
49}
50
51/// A binary operand
52#[derive(Copy,Clone,Eq,PartialEq,Debug)]
53pub enum BinaryOperator {
54    Add, Sub,
55    Mul, Div
56}
57
58/// Call of a named function
59#[derive(Clone,PartialEq,Debug)]
60pub struct FunctionCall {
61    /// Name of function
62    pub fn_name: String,
63    /// Parameter list
64    pub parameters: Vec<Expression>
65}
66
67/// Block expressions (i.e. a block of statements terminated with an expression)
68#[derive(Clone,PartialEq,Debug)]
69pub struct BlockExpression {
70    pub statements: Vec<Statement>,
71    pub expression: Box<Expression>
72}
73
74
75/// Array indexing expressions
76#[derive(Clone,PartialEq,Debug)]
77pub struct AtIndex {
78    pub array: String,
79    pub index: CompileTimeConstant<usize>
80}
81
82#[derive(Clone,PartialEq,Debug)]
83pub struct AdHocArrayExpression {
84    pub elements: Vec<Expression>
85}