]> gitweb.ps.run Git - toc/blobdiff - src/repr.h
generic grammar
[toc] / src / repr.h
index 6737ef4ce35d2b9b8a9fac64406811dc6656ceea..eb46e3a6a3f22e9536d06d8dc1290aa8a083230b 100644 (file)
@@ -14,22 +14,39 @@ struct Body;
 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 AccessExpr;\r
 struct BracketsExpr;\r
-struct OperatorExpr;\r
+struct UnaryOperatorExpr;\r
+struct BinaryOperatorExpr;\r
+struct TernaryOperatorExpr;\r
 struct DotExpr;\r
+struct ParenExpr;\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
+  bool _staticArray;\r
+  int _arraySize;\r
+};\r
 \r
 struct Type {\r
   std::string name;\r
+  std::vector<TypeModifier> modifiers;\r
 };\r
 \r
 struct Variable {\r
@@ -62,19 +79,29 @@ struct Program {
 };\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
@@ -83,41 +110,98 @@ struct BracketsExpr {
   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
+  bool parenthesized;\r
+\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
@@ -125,23 +209,25 @@ struct WhileStmt {
   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