X-Git-Url: https://gitweb.ps.run/toc/blobdiff_plain/9f5457a18f551d261e4bd380ea16a52dc5b04cf9..8aeae09e74b46ca52866f22b48f55fecdf27b849:/src/check.h 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 structs, + std::vector funcs, + std::vector vars) +{ + // switch (s.type) { + // case StmtType::Assign: + // if (!checkVar(s._assign.)) + // } + return true; +} + +bool checkFunction( + const Function & f, + std::vector structs, + std::vector funcs, + std::vector 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 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