#pragma once #include #include #include #include "TocParser.h" using namespace std; struct Type; struct Variable; struct Body; struct Function; struct Struct; struct Program; struct CallExpr; struct LiteralExpr; struct VariableExpr; struct BracketsExpr; struct OperatorExpr; struct DotExpr; struct Expr; struct IfStmt; struct WhileStmt; struct ReturnStmt; struct AssignStmt; struct Stmt; struct Type { std::string name; }; struct Variable { std::string name; Type type; }; struct Body { std::vector variables; std::vector statements; }; struct Function { Type returnType; std::string name; std::vector parameters; Body body; }; struct Struct { std::string name; std::vector members; std::vector methods; }; struct Program { std::vector variables; std::vector structs; std::vector functions; }; enum class ExprType { Call, Literal, Variable, Brackets, Operator, Dot }; struct CallExpr { std::string functionName; std::vector arguments; }; struct LiteralExpr { int i; }; struct VariableExpr { std::string name; }; struct BracketsExpr { std::shared_ptr lexpr; std::shared_ptr rexpr; }; enum class OperatorType { Plus, Minus, Multiply, Divide, Equals, NotEquals, LessThan, GreaterThan }; struct OperatorExpr { std::shared_ptr lexpr; std::shared_ptr rexpr; OperatorType type; }; struct DotExpr { std::shared_ptr lexpr; std::string name; }; struct Expr { ExprType type; CallExpr _call; LiteralExpr _literal; VariableExpr _variable; BracketsExpr _brackets; OperatorExpr _operator; DotExpr _dot; }; enum class StmtType { If, While, Return, Assign, Expr }; struct IfStmt { Expr condition; Body body; }; struct WhileStmt { Expr condition; Body body; }; struct ReturnStmt { Expr expr; }; struct AssignStmt { Expr lexpr; Expr rexpr; }; struct Stmt { StmtType type; IfStmt _if; WhileStmt _while; ReturnStmt _return; AssignStmt _assign; Expr _expr; };