]> gitweb.ps.run Git - toc/blob - src/repr.h
Initial commit
[toc] / src / repr.h
1 #pragma once\r
2 \r
3 #include <vector>\r
4 #include <string>\r
5 #include <memory>\r
6 \r
7 #include "TocParser.h"\r
8 \r
9 using namespace std;\r
10 \r
11 struct Type;\r
12 struct Variable;\r
13 struct Body;\r
14 struct Function;\r
15 struct Struct;\r
16 struct Program;\r
17 struct CallExpr;\r
18 struct LiteralExpr;\r
19 struct VariableExpr;\r
20 struct BracketsExpr;\r
21 struct OperatorExpr;\r
22 struct DotExpr;\r
23 struct Expr;\r
24 struct IfStmt;\r
25 struct WhileStmt;\r
26 struct ReturnStmt;\r
27 struct AssignStmt;\r
28 struct Stmt;\r
29 \r
30 \r
31 struct Type {\r
32   std::string name;\r
33 };\r
34 \r
35 struct Variable {\r
36   std::string name;\r
37   Type type;\r
38 };\r
39 \r
40 struct Body {\r
41   std::vector<Variable> variables;\r
42   std::vector<Stmt> statements;\r
43 };\r
44 \r
45 struct Function {\r
46   std::string name;\r
47   std::vector<Variable> parameters;\r
48   Body body;\r
49 };\r
50 \r
51 struct Struct {\r
52   std::string name;\r
53   std::vector<Variable> members;\r
54   std::vector<Function> methods;\r
55 };\r
56 \r
57 struct Program {\r
58   std::vector<Variable> variables;\r
59   std::vector<Struct> structs;\r
60   std::vector<Function> functions;\r
61 };\r
62 \r
63 enum class ExprType {\r
64   Call, Literal, Variable, Brackets, Operator, Dot\r
65 };\r
66 \r
67 struct CallExpr {\r
68   Function function;\r
69   std::vector<Expr> arguments;\r
70 };\r
71 \r
72 struct LiteralExpr {\r
73   int i;\r
74 };\r
75 \r
76 struct VariableExpr {\r
77   std::string name;\r
78 };\r
79 \r
80 struct BracketsExpr {\r
81   BracketsExpr() {}\r
82   BracketsExpr(const BracketsExpr &) {}\r
83   BracketsExpr & operator=(const BracketsExpr &) {return *this;};\r
84   std::unique_ptr<Expr> lexpr;\r
85   std::unique_ptr<Expr> rexpr;\r
86 };\r
87 \r
88 enum class OperatorType {\r
89   Plus, Minus, Multiply, Divide,\r
90   Equals, NotEquals,\r
91   LessThan, GreaterThan\r
92 };\r
93 \r
94 struct OperatorExpr {\r
95   OperatorExpr() {}\r
96   OperatorExpr(const OperatorExpr &) {}\r
97   OperatorExpr & operator=(const OperatorExpr &) {return *this;};\r
98   std::unique_ptr<Expr> lexpr;\r
99   std::unique_ptr<Expr> rexpr;\r
100   OperatorType type;\r
101 };\r
102 \r
103 struct DotExpr {\r
104   DotExpr() {}\r
105   DotExpr(const DotExpr &) {}\r
106   DotExpr & operator=(const DotExpr &) {return *this;};\r
107   std::unique_ptr<Expr> lexpr;\r
108   std::string name;\r
109 };\r
110 \r
111 struct Expr {\r
112   ExprType type;\r
113 \r
114   CallExpr     _call;\r
115   LiteralExpr  _literal;\r
116   VariableExpr _variable;\r
117   BracketsExpr _brackets;\r
118   OperatorExpr _operator;\r
119   DotExpr      _dot;\r
120 };\r
121 \r
122 enum class StmtType {\r
123   If, While, Return, Assign, Expr\r
124 };\r
125 \r
126 struct IfStmt {\r
127   Expr condition;\r
128   Body body;\r
129 };\r
130 \r
131 struct WhileStmt {\r
132   Expr condition;\r
133   Body body;\r
134 };\r
135 \r
136 struct ReturnStmt {\r
137   Expr expr;\r
138 };\r
139 \r
140 struct AssignStmt {\r
141   Expr lexpr;\r
142   Expr rexpr;\r
143 };\r
144 \r
145 struct Stmt {\r
146   StmtType type;\r
147   \r
148   IfStmt     _if;\r
149   WhileStmt  _while;\r
150   ReturnStmt _return;\r
151   AssignStmt _assign;\r
152   Expr       _expr;\r
153 };\r
154 \r
155 \r