use std::{ops::Range, rc::Rc}; use crate::language_frontend::abstract_syntax_tree::ast::Expr; /// Abstract Syntax Tree pub type BlockStatement = Vec; pub type Span = Range; #[derive(Clone, Debug, PartialEq)] pub enum Statement { Var(Ident, Option), } #[derive(Clone, Debug, PartialEq)] pub enum BinaryOp { Multiply, Divide, Add, Substract, Equals, NotEquals, Less, LessEquals, Greater, GreaterEquals, And, Or, } #[derive(Clone, Debug, PartialEq)] pub enum UnaryOp { Not, Minus, Plus, } #[derive(Clone, Debug, PartialEq)] pub enum Literal { UnsignedInteger(u64), Bool(bool), Char(char), String(Rc), Int(i64), Float(f64), } #[derive(Clone, Debug, PartialEq)] pub enum Type { Integer, Float, Bool, Char, String, } #[derive(Clone, Debug, PartialEq)] pub enum Value { Integer(i64), Float(f64), Bool(bool), Char(char), String(String), } impl Value { pub fn is_type(&self, ty: &Type) -> bool { match (ty, self) { (Type::Bool, Value::Bool(_)) => true, (Type::Char, Value::Char(_)) => true, (Type::Integer, Value::Integer(_)) => true, (Type::Float, Value::Float(_)) => true, (Type::String, Value::String(_)) => true, _ => false, } } } //--------------------------------------- // Structs //--------------------------------------- #[derive(Clone, Debug, PartialEq)] pub struct Ident(pub Rc); #[derive(Clone, Debug, PartialEq)] pub struct While { pub condition: Expr, pub body: BlockStatement, } #[derive(Clone, Debug, PartialEq)] pub struct Condition { pub condition: Expr, pub if_body: BlockStatement, pub else_body: Option, } /// Example: `x = y` #[derive(Clone, Debug, PartialEq)] pub struct Assignment { pub target: String, pub value: Box, } /// Example: `var String: foo = "Test"` #[derive(Clone, Debug, PartialEq)] pub struct Var { pub ty: Option, pub ident: String, pub value: Box, } /// Example: `x++` #[derive(Clone, Debug, PartialEq)] pub struct Unary { pub operator: UnaryOp, pub operand: Box, } /// Example: `1 + 1` #[derive(Clone, Debug, PartialEq)] pub struct Binary { pub lhs: Box, pub operator: BinaryOp, pub rhs: Box, } /// Represents the Structure of a `Function` in AkaiLang /// /// Examples: ///```AkaiLang ///fun helloWorld() { /// print("Hello World") ///} ///``` ///
/// ///```AkaiLang ///fun returnsIntPlusOne(i: int): int { /// -> i + 1 ///} ///``` #[derive(Clone, Debug, PartialEq)] pub struct Function { pub name: String, pub params: Option>, pub return_type: Option, pub body: Option>, pub body_expr: Option>, } #[derive(Clone, Debug, PartialEq)] pub struct Call { pub callee: Box, pub arguments: Vec, }