mod ast_node;
mod map_context;
pub use self::ast_node::AstNode;
pub use self::map_context::MapContext;
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum Kind {
Module,
Identifier,
NumberLiteral,
StringLiteral,
Symbol,
Tuple,
Record,
UnOp,
BiOp,
Lambda,
Select,
Apply,
Parameter,
Variable,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Module<C> {
pub context: C,
pub variables: Vec<Variable<C>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Identifier<C> {
pub context: C,
pub value: String,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Expression<C> {
NumberLiteral(NumberLiteral<C>),
StringLiteral(StringLiteral<C>),
Symbol(Symbol<C>),
Tuple(Tuple<C>),
Record(Record<C>),
Identifier(Identifier<C>),
UnOp(UnOp<C>),
BiOp(BiOp<C>),
Lambda(Lambda<C>),
Select(Select<C>),
Apply(Apply<C>),
Unknown,
}
#[derive(Clone, Debug, PartialEq)]
pub struct NumberLiteral<C> {
pub context: C,
pub value: NumberValue,
}
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
pub enum NumberValue {
U8(u8),
U16(u16),
U32(u32),
U64(u64),
I8(i8),
I16(i16),
I32(i32),
I64(i64),
F32(f32),
F64(f64),
Invalid,
}
#[derive(Clone, Debug, PartialEq)]
pub struct StringLiteral<C> {
pub context: C,
pub value: StringValue,
}
#[derive(Clone, Debug, PartialEq)]
pub enum StringValue {
String(String),
Invalid,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Symbol<C> {
pub context: C,
pub label: String,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Tuple<C> {
pub context: C,
pub fields: Vec<Expression<C>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Record<C> {
pub context: C,
pub fields: Vec<(Identifier<C>, Expression<C>)>,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum UnOperator {
Not,
BNot,
Cl0,
Cl1,
Cls,
Ct0,
Ct1,
C0,
C1,
Sqrt,
}
#[derive(Clone, Debug, PartialEq)]
pub struct UnOp<C> {
pub context: C,
pub operator: UnOperator,
pub operand: Box<Expression<C>>,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum BiOperator {
Eq,
Ne,
Lt,
Ge,
Gt,
Le,
Cmp,
Add,
Sub,
Mul,
Div,
Rem,
And,
BAnd,
Or,
BOr,
Xor,
BXor,
AndNot,
BAndNot,
OrNot,
BOrNot,
XorNot,
BXorNot,
RotL,
RotR,
ShL,
ShR,
}
#[derive(Clone, Debug, PartialEq)]
pub struct BiOp<C> {
pub context: C,
pub lhs: Box<Expression<C>>,
pub operator: BiOperator,
pub rhs: Box<Expression<C>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Lambda<C> {
pub context: C,
pub parameters: Vec<Parameter<C>>,
pub signature: Option<Box<Expression<C>>>,
pub statements: Vec<Statement<C>>,
pub result: Box<Expression<C>>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Statement<C> {
Variable(Variable<C>),
Expression(Expression<C>),
}
#[derive(Clone, Debug, PartialEq)]
pub struct Variable<C> {
pub context: C,
pub name: Identifier<C>,
pub initializer: Expression<C>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Select<C> {
pub context: C,
pub record: Box<Expression<C>>,
pub field: Identifier<C>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Apply<C> {
pub context: C,
pub function: Box<Expression<C>>,
pub parameters: Vec<Expression<C>>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Parameter<C> {
pub context: C,
pub name: Identifier<C>,
pub signature: Option<Expression<C>>,
}