\r
using namespace std;\r
\r
+// This contains a 1 to 1 representation of the defined language\r
+\r
struct Type;\r
struct Variable;\r
struct Body;\r
struct ReturnStmt;\r
struct Stmt;\r
\r
+// Context is a collection of everything that can be defined in a namespace\r
+// that is reused for bodies so that the hierarchy can be walked uniformly\r
+// both up and down using the parent variable\r
struct Context\r
{\r
+ std::optional<std::string> name;\r
std::shared_ptr<Context> parent;\r
std::vector<Variable> variables;\r
+ std::vector<Function> functions;\r
+ std::vector<Struct> structs;\r
+ std::vector<Namespace> namespaces;\r
};\r
\r
enum class TypeModifierType\r
std::vector<std::string> namespacePrefixes;\r
std::string name;\r
std::vector<TypeModifier> modifiers;\r
+ std::vector<Type> genericInstantiation;\r
+ \r
+ bool operator!=(const Type & that)\r
+ {\r
+ if (this->name != that.name)\r
+ return true;\r
+\r
+ for (int i = 0; i < this->modifiers.size(); i++)\r
+ if (this->modifiers[i].type != that.modifiers[i].type)\r
+ return true;\r
+\r
+ for (int i = 0; i < this->namespacePrefixes.size(); i++)\r
+ if (this->namespacePrefixes[i] != that.namespacePrefixes[i])\r
+ return true;\r
+ return false;\r
+ }\r
};\r
\r
struct Variable\r
\r
struct Function\r
{\r
- Type returnType;\r
std::string name;\r
+ Type returnType;\r
std::vector<Variable> parameters;\r
+ bool defined;\r
+\r
+ std::vector<std::string> genericTypeNames;\r
+ std::vector<std::vector<Type>> genericInstantiations;\r
+\r
Body body;\r
};\r
\r
struct Struct\r
{\r
std::string name;\r
+ std::vector<std::string> genericTypeNames;\r
+ std::vector<std::vector<Type>> genericInstantiations;\r
std::vector<StructMember<Variable>> members;\r
std::vector<StructMember<Function>> methods;\r
};\r
{\r
std::string name;\r
std::shared_ptr<Context> ctx;\r
- std::vector<Struct> structs;\r
- std::vector<Function> functions;\r
- std::vector<Namespace> namespaces;\r
};\r
\r
struct Program\r
{\r
std::shared_ptr<Context> ctx;\r
- std::vector<Struct> structs;\r
- std::vector<Function> functions;\r
- std::vector<Namespace> namespaces;\r
};\r
\r
enum class ExprType\r
std::vector<std::string> namespacePrefixes;\r
std::string functionName;\r
std::vector<Expr> arguments;\r
+ std::vector<Type> genericInstantiation;\r
};\r
\r
struct MethodExpr\r
std::shared_ptr<Expr> expr;\r
std::string methodName;\r
std::vector<Expr> arguments;\r
+ std::vector<Type> genericInstantiation;\r
};\r
\r
enum class LitType\r
\r
struct DotExpr\r
{\r
+ bool isPointer;\r
std::shared_ptr<Expr> expr;\r
std::string identifier;\r
};\r
\r
+// OperatorType enum with corresponding string array to lookup\r
+// enum from string and the other way round\r
enum class PrefixOperatorType\r
{\r
Plus, Minus, Increment, Decrement,\r