//! AbleScript's Abstract Syntax tree //! //! Statements are the type which is AST made of, as they //! express an effect. //! //! Expressions are just operations and they cannot be //! used as statements. Functions in AbleScript are in fact //! just plain subroutines and they do not return any value, //! so their calls are statements. use crate::variables::Value; type Span = std::ops::Range; #[derive(Debug)] pub struct Iden { pub iden: String, pub span: Span, } impl Iden { pub fn new(iden: String, span: Span) -> Self { Self { iden, span } } } #[derive(Debug)] pub struct Block { pub block: Vec, } /// A syntactic unit expressing an effect. #[derive(Debug)] pub struct Stmt { pub kind: StmtKind, pub span: Span, } #[derive(Debug)] pub enum StmtKind { // Control flow If { cond: Expr, body: Block, }, Loop { body: Block, }, Break, HopBack, Var { iden: Iden, init: Option, }, Functio { iden: Iden, args: Vec, body: Block, }, Call { iden: Iden, args: Vec, }, Print(Expr), Melo(Iden), } impl Stmt { pub fn new(kind: StmtKind, span: Span) -> Self { Self { kind, span } } } /// Expression is parse unit which do not cause any effect, /// like math and logical operations or values. #[derive(Debug)] pub struct Expr { kind: ExprKind, span: Span, } #[derive(Debug)] pub enum ExprKind { BinOp { lhs: Box, rhs: Box, kind: BinOpKind, }, Not(Box), Literal(Value), Variable(String), } impl Expr { pub fn new(kind: ExprKind, span: Span) -> Self { Self { kind, span } } } #[derive(Debug)] pub enum BinOpKind { Add, Subtract, Multiply, Divide, Greater, Less, Equal, NotEqual, And, Or, }