--- /dev/null
+#pragma once\r
+\r
+#include "repr.h"\r
+\r
+bool checkStmt(\r
+ const Stmt & s,\r
+ std::vector<Struct> structs,\r
+ std::vector<Function> funcs,\r
+ std::vector<Variable> vars)\r
+{\r
+ // switch (s.type) {\r
+ // case StmtType::Assign:\r
+ // if (!checkVar(s._assign.))\r
+ // }\r
+ return true;\r
+}\r
+\r
+bool checkFunction(\r
+ const Function & f,\r
+ std::vector<Struct> structs,\r
+ std::vector<Function> funcs,\r
+ std::vector<Variable> vars)\r
+{\r
+ vars.insert(vars.end(), f.parameters.begin(), f.parameters.end());\r
+ vars.insert(vars.end(), f.body.variables.begin(), f.body.variables.end());\r
+ for (auto s : f.body.statements) {\r
+ if (!checkStmt(s, structs, funcs, vars))\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool checkProgram(const Program & p)\r
+{\r
+ for (auto f : p.functions) {\r
+ if (!checkFunction(f, p.structs, p.functions, p.variables))\r
+ return false;\r
+ }\r
+ for (auto s : p.structs) {\r
+ std::vector<Variable> vars = p.variables;\r
+ for (auto v : s.members)\r
+ vars.push_back(v);\r
+ for (auto f : s.methods) {\r
+ if (!checkFunction(f, p.structs, p.functions, vars))\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+}
\ No newline at end of file