]> gitweb.ps.run Git - toc/blobdiff - src/check.h
type modifiers, parenthesized expressions, chained access expressions
[toc] / src / check.h
diff --git a/src/check.h b/src/check.h
new file mode 100644 (file)
index 0000000..9e6797f
--- /dev/null
@@ -0,0 +1,49 @@
+#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