struct Function;\r
struct Struct;\r
struct Program;\r
-struct CallExpr;\r
-struct LiteralExpr;\r
-struct VariableExpr;\r
+struct FuncExpr;\r
+struct LitExpr;\r
+struct IdentifierExpr;\r
struct BracketsExpr;\r
-struct OperatorExpr;\r
+struct UnaryOperatorExpr;\r
+struct BinaryOperatorExpr;\r
+struct TernaryOperatorExpr;\r
struct DotExpr;\r
struct Expr;\r
struct IfStmt;\r
+struct SwitchStmt;\r
+struct ForStmt;\r
struct WhileStmt;\r
-struct ReturnStmt;\r
struct AssignStmt;\r
+struct ReturnStmt;\r
struct Stmt;\r
\r
+enum class TypeModifierType {\r
+ Pointer, Array\r
+};\r
+\r
+struct TypeModifier {\r
+ TypeModifierType type;\r
+\r
+ int _arraySize;\r
+};\r
\r
struct Type {\r
std::string name;\r
+ std::vector<TypeModifier> modifiers;\r
};\r
\r
struct Variable {\r
};\r
\r
enum class ExprType {\r
- Call, Literal, Variable, Brackets, Operator, Dot\r
+ Func, Lit, Identifier, Brackets, UnaryOperator, BinaryOperator, TernaryOperator, Dot\r
};\r
\r
-struct CallExpr {\r
+struct FuncExpr {\r
std::string functionName;\r
std::vector<Expr> arguments;\r
};\r
\r
-struct LiteralExpr {\r
- int i;\r
+enum class LitType {\r
+ Int, Decimal, String, Bool\r
+};\r
+\r
+struct LitExpr {\r
+ LitType type;\r
+\r
+ int _int;\r
+ double _decimal;\r
+ std::string _string;\r
+ bool _bool;\r
};\r
\r
-struct VariableExpr {\r
+// TODO: accessExpr\r
+struct IdentifierExpr {\r
std::string name;\r
};\r
\r
std::shared_ptr<Expr> rexpr;\r
};\r
\r
-enum class OperatorType {\r
- Plus, Minus, Multiply, Divide,\r
- Equals, NotEquals,\r
- LessThan, GreaterThan\r
+enum class UnaryOperatorType {\r
+ Plus, Minus, IncrementPre, DecrementPre, IncrementPost, DecrementPost,\r
+ LogicalNot, BitwiseNot, Dereference, AddressOf,\r
+ COUNT\r
};\r
\r
-struct OperatorExpr {\r
+enum class BinaryOperatorType {\r
+ Plus, Minus, Multiply, Divide, Modulo, BitwiseAnd, BitwiseOr, BitwiseXor, LessThan, GreaterThan,\r
+ LeftShift, RightShift, LogicalAnd, LogicalOr, Equals, NotEquals, LessThanEquals, GreaterThanEquals, BitwiseAndEquals, BitwiseOrEquals, BitwiseXorEquals,\r
+ PlusEquals, MinusEquals, MultiplyEquals, DivideEquals, ModuloEquals,\r
+ LeftShiftEquals, RightShiftEquals,\r
+ COUNT\r
+};\r
+static std::string UnaryOperatorTypeStrings[] = {\r
+ "+", "-", "++", "--", "++", "--", "!", "~", "*", "&" };\r
+\r
+static std::string BinaryOperatorTypeStrings[] = {\r
+ "+", "-", "*", "/", "%", "&", "|", "^", "<", ">",\r
+ "<<",">>","&&","||","==","!=","<=",">=","&=","|=","^=",\r
+ "+=","-=","*=","/=","%=",\r
+ "<<=",">>=" };\r
+\r
+struct UnaryOperatorExpr {\r
+ UnaryOperatorType type;\r
+ std::shared_ptr<Expr> expr;\r
+};\r
+\r
+struct BinaryOperatorExpr {\r
+ BinaryOperatorType type;\r
std::shared_ptr<Expr> lexpr;\r
std::shared_ptr<Expr> rexpr;\r
- OperatorType type;\r
};\r
\r
-struct DotExpr {\r
+struct TernaryOperatorExpr {\r
std::shared_ptr<Expr> lexpr;\r
- std::string name;\r
+ std::shared_ptr<Expr> rexprTrue;\r
+ std::shared_ptr<Expr> rexprFalse;\r
};\r
\r
+struct DotExpr {\r
+ std::shared_ptr<Expr> expr;\r
+ IdentifierExpr ident;\r
+};\r
+\r
+// TODO: paren expr\r
struct Expr {\r
ExprType type;\r
\r
- CallExpr _call;\r
- LiteralExpr _literal;\r
- VariableExpr _variable;\r
- BracketsExpr _brackets;\r
- OperatorExpr _operator;\r
- DotExpr _dot;\r
+ FuncExpr _func;\r
+ LitExpr _lit;\r
+ IdentifierExpr _identifier;\r
+ BracketsExpr _brackets;\r
+ UnaryOperatorExpr _unaryOperator;\r
+ BinaryOperatorExpr _binaryOperator;\r
+ TernaryOperatorExpr _ternaryOperator;\r
+ DotExpr _dot;\r
};\r
\r
enum class StmtType {\r
- If, While, Return, Assign, Expr\r
+ If, Switch, For, While, Assign, Return, Expr\r
};\r
\r
+struct ElseStmt {\r
+ bool _if;\r
+ std::shared_ptr<Expr> expr;\r
+ Body body;\r
+};\r
struct IfStmt {\r
Expr condition;\r
Body body;\r
+ std::vector<ElseStmt> elses;\r
+};\r
+\r
+struct SwitchCase {\r
+ std::shared_ptr<Expr> expr;\r
+ Body body;\r
+};\r
+\r
+struct SwitchStmt {\r
+ IdentifierExpr ident;\r
+ std::vector<SwitchCase> cases;\r
+};\r
+\r
+// TODO: int i = 0 (var decl)\r
+struct ForStmt {\r
+ std::string varName;\r
+ std::shared_ptr<Expr> initValue;\r
+ std::shared_ptr<Expr> condition;\r
+ std::shared_ptr<Expr> action;\r
+ Body body;\r
};\r
\r
struct WhileStmt {\r
Body body;\r
};\r
\r
-struct ReturnStmt {\r
+struct AssignStmt {\r
+ std::string name;\r
Expr expr;\r
};\r
\r
-struct AssignStmt {\r
- Expr lexpr;\r
- Expr rexpr;\r
+struct ReturnStmt {\r
+ Expr expr;\r
};\r
\r
struct Stmt {\r
StmtType type;\r
\r
- IfStmt _if;\r
- WhileStmt _while;\r
- ReturnStmt _return;\r
- AssignStmt _assign;\r
- Expr _expr;\r
+ IfStmt _if;\r
+ SwitchStmt _switch;\r
+ ForStmt _for;\r
+ WhileStmt _while;\r
+ AssignStmt _assign;\r
+ ReturnStmt _return;\r
+ Expr _expr;\r
};\r
\r
\r