abouttreesummaryrefslogcommitdiff
path: root/src/check.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/check.h')
-rw-r--r--src/check.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/check.h b/src/check.h
new file mode 100644
index 0000000..9e6797f
--- /dev/null
+++ b/src/check.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "repr.h"
+
+bool checkStmt(
+ const Stmt & s,
+ std::vector<Struct> structs,
+ std::vector<Function> funcs,
+ std::vector<Variable> vars)
+{
+ // switch (s.type) {
+ // case StmtType::Assign:
+ // if (!checkVar(s._assign.))
+ // }
+ return true;
+}
+
+bool checkFunction(
+ const Function & f,
+ std::vector<Struct> structs,
+ std::vector<Function> funcs,
+ std::vector<Variable> vars)
+{
+ vars.insert(vars.end(), f.parameters.begin(), f.parameters.end());
+ vars.insert(vars.end(), f.body.variables.begin(), f.body.variables.end());
+ for (auto s : f.body.statements) {
+ if (!checkStmt(s, structs, funcs, vars))
+ return false;
+ }
+ return true;
+}
+
+bool checkProgram(const Program & p)
+{
+ for (auto f : p.functions) {
+ if (!checkFunction(f, p.structs, p.functions, p.variables))
+ return false;
+ }
+ for (auto s : p.structs) {
+ std::vector<Variable> vars = p.variables;
+ for (auto v : s.members)
+ vars.push_back(v);
+ for (auto f : s.methods) {
+ if (!checkFunction(f, p.structs, p.functions, vars))
+ return false;
+ }
+ }
+ return true;
+} \ No newline at end of file