]> gitweb.ps.run Git - toc/commitdiff
pre change
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 4 Aug 2021 13:05:42 +0000 (15:05 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Wed, 4 Aug 2021 13:05:42 +0000 (15:05 +0200)
src/find.h
src/main.cpp
src/repr.h
src/repr_get.h
src/toc.h

index 31400ab2b055132c8c4d57a3cae1d8eec1d1fa93..a969baee8b875d3b1b66ab5440698e839bcaedca 100644 (file)
@@ -78,7 +78,7 @@ opt<Variable> findVariable(
     std::cout << n << std::endl;\r
   if (namespacePrefixes.empty())\r
   {\r
-    return find<Variable>(p.variables, [&](Variable v) { return v.name == name; });\r
+    return find<Variable>(p.ctx->variables, [&](Variable v) { return v.name == name; });\r
   }\r
   \r
   auto n = find<Namespace>(p.namespaces, [&](Namespace n) { return n.name == namespacePrefixes[0]; });\r
@@ -93,7 +93,7 @@ opt<Variable> findVariable(
     if (!n.has_value())\r
       return nullopt;\r
   }\r
-  return find<Variable>(n.value().variables, [&](Variable v) { return v.name == name; });\r
+  return find<Variable>(n.value().ctx->variables, [&](Variable v) { return v.name == name; });\r
 }\r
 \r
 opt<Function> findStructMethod(\r
index 19b35f32ddbde4361e0b053b2a317f8172f84e68..461d0148b05f9b14e3b87d385f9f5493253dfd69 100644 (file)
@@ -7,7 +7,7 @@
 #include "toc.h"\r
 #include "repr.h"\r
 #include "repr_get.h"\r
-#include "check.h"\r
+//#include "check.h"\r
 \r
 using namespace antlr4;\r
 \r
@@ -35,14 +35,14 @@ int main(int argc, const char * argv[])
 \r
   //std::cout << "Parse Tree: " << s << std::endl;\r
 \r
-  Program prg = getProgram(prog);\r
+  Program prg = getProgram(prog, nullptr);\r
 \r
   try\r
   {\r
     tocProgram(std::cout, prg);\r
 \r
-    if (!checkProgram(prg))\r
-      std::cerr << "Error" << std::endl;\r
+    // if (!checkProgram(prg))\r
+    //   std::cerr << "Error" << std::endl;\r
 \r
     std::ofstream ofs("output.c");\r
     tocProgram(ofs, prg);\r
index f196427fbe6a9cfae8cf34e6ac95a6d8978caa14..fc77d92b43a8f1815abda6dfe5a802e5424853c6 100644 (file)
@@ -37,6 +37,12 @@ struct AssignStmt;
 struct ReturnStmt;\r
 struct Stmt;\r
 \r
+struct Context\r
+{\r
+  std::shared_ptr<Context> parent;\r
+  std::vector<Variable> variables;\r
+};\r
+\r
 enum class TypeModifierType\r
 {\r
   Pointer, Array\r
@@ -65,7 +71,7 @@ struct Variable
 \r
 struct Body\r
 {\r
-  std::vector<Variable> variables;\r
+  std::shared_ptr<Context> ctx;\r
   std::vector<Stmt> statements;\r
 };\r
 \r
@@ -95,7 +101,7 @@ struct Struct
 struct Namespace\r
 {\r
   std::string name;\r
-  std::vector<Variable> variables;\r
+  std::shared_ptr<Context> ctx;\r
   std::vector<Struct> structs;\r
   std::vector<Function> functions;\r
   std::vector<Namespace> namespaces;\r
@@ -103,7 +109,7 @@ struct Namespace
 \r
 struct Program\r
 {\r
-  std::vector<Variable> variables;\r
+  std::shared_ptr<Context> ctx;\r
   std::vector<Struct> structs;\r
   std::vector<Function> functions;\r
   std::vector<Namespace> namespaces;\r
index 54aea6fafa012897e1793a4ac57256bd89f590b0..396c71a01c2c053ac2da5357097ef896b02d1640 100644 (file)
@@ -4,11 +4,11 @@
 \r
 Type                getType(TocParser::TypeContext * ctx);\r
 Variable            getVariable(TocParser::VarContext * ctx);\r
-Body                getBody(TocParser::BodyContext * ctx);\r
-Function            getFunction(TocParser::FuncContext * ctx);\r
-Struct              getStruct(TocParser::StructDeclContext * ctx);\r
-Namespace           getNamespace(TocParser::NamespaceDeclContext * ctx);\r
-Program             getProgram(TocParser::ProgContext * ctx);\r
+Body                getBody(TocParser::BodyContext * ctx, std::shared_ptr<Context> parent);\r
+Function            getFunction(TocParser::FuncContext * ctx, std::shared_ptr<Context> parent);\r
+Struct              getStruct(TocParser::StructDeclContext * ctx, std::shared_ptr<Context> parent);\r
+Namespace           getNamespace(TocParser::NamespaceDeclContext * ctx, std::shared_ptr<Context> parent);\r
+Program             getProgram(TocParser::ProgContext * ctx, std::shared_ptr<Context> parent);\r
 \r
 \r
 Expr                getExpr(TocParser::FuncExprContext * ctx);\r
@@ -24,7 +24,7 @@ Expr                getExpr(TocParser::BracketExprContext * ctx);
 Expr                getExpr(TocParser::IdentifierExprContext * ctx);\r
 Expr                getExpr(TocParser::ExprContext * ctx);\r
 \r
-Stmt                getStmt(TocParser::StmtContext * ctx);\r
+Stmt                getStmt(TocParser::StmtContext * ctx, std::shared_ptr<Context> parent);\r
 \r
 Type getType(TocParser::TypeContext * ctx)\r
 {\r
@@ -52,25 +52,27 @@ Variable getVariable(TocParser::VarContext * ctx)
   result.type = getType(ctx->type());\r
   return result;\r
 }\r
-Body getBody(TocParser::BodyContext * ctx)\r
+Body getBody(TocParser::BodyContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Body result;\r
+  result.ctx = std::make_unique<Context>();\r
+  result.ctx->parent = parent;\r
   for (auto s : ctx->stmt())\r
   {\r
     if (s->varDecl() != nullptr)\r
     {\r
-      result.variables.push_back(getVariable(s->varDecl()->var()));\r
+      result.ctx->variables.push_back(getVariable(s->varDecl()->var()));\r
       if (s->varDecl()->var()->expr() != nullptr)\r
-        result.statements.push_back(getStmt(s));\r
+        result.statements.push_back(getStmt(s, result.ctx));\r
     }\r
     else\r
     {\r
-      result.statements.push_back(getStmt(s));\r
+      result.statements.push_back(getStmt(s, result.ctx));\r
     }\r
   }\r
   return result;\r
 }\r
-Function getFunction(TocParser::FuncContext * ctx)\r
+Function getFunction(TocParser::FuncContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Function result;\r
   result.name = ctx->funcName()->NAME()->toString();\r
@@ -80,10 +82,10 @@ Function getFunction(TocParser::FuncContext * ctx)
     for (auto p : ctx->parameter()->var())\r
       result.parameters.push_back(getVariable(p));\r
   }\r
-  result.body = getBody(ctx->body());\r
+  result.body = getBody(ctx->body(), parent);\r
   return result;\r
 }\r
-Struct getStruct(TocParser::StructDeclContext * ctx)\r
+Struct getStruct(TocParser::StructDeclContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Struct result;\r
   result.name = ctx->structName()->NAME()->toString();\r
@@ -99,58 +101,60 @@ Struct getStruct(TocParser::StructDeclContext * ctx)
     if (m->structMethod() != nullptr)\r
     {\r
       result.methods.push_back({\r
-        getFunction(m->structMethod()->func()),\r
+        getFunction(m->structMethod()->func(), parent),\r
         m->privateDecl() != nullptr\r
       });\r
     }\r
   }\r
   return result;\r
 }\r
-Namespace getNamespace(TocParser::NamespaceDeclContext * ctx)\r
+Namespace getNamespace(TocParser::NamespaceDeclContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Namespace result;\r
+  result.ctx = std::make_unique<Context>();\r
   result.name = ctx->typeName()->getText();\r
   for (auto d : ctx->decl())\r
   {\r
     if (d->varDecl() != nullptr)\r
     {\r
-      result.variables.push_back(getVariable(d->varDecl()->var()));\r
+      result.ctx->variables.push_back(getVariable(d->varDecl()->var()));\r
     }\r
     if (d->funcDecl() != nullptr)\r
     {\r
-      result.functions.push_back(getFunction(d->funcDecl()->func()));\r
+      result.functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
     }\r
     if (d->structDecl() != nullptr)\r
     {\r
-      result.structs.push_back(getStruct(d->structDecl()));\r
+      result.structs.push_back(getStruct(d->structDecl(), result.ctx));\r
     }\r
     if (d->namespaceDecl() != nullptr)\r
     {\r
-      result.namespaces.push_back(getNamespace(d->namespaceDecl()));\r
+      result.namespaces.push_back(getNamespace(d->namespaceDecl(), result.ctx));\r
     }\r
   }\r
   return result;\r
 }\r
-Program getProgram(TocParser::ProgContext * ctx)\r
+Program getProgram(TocParser::ProgContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Program result;\r
+  result.ctx = std::make_unique<Context>();\r
   for (auto d : ctx->decl())\r
   {\r
     if (d->varDecl() != nullptr)\r
     {\r
-      result.variables.push_back(getVariable(d->varDecl()->var()));\r
+      result.ctx->variables.push_back(getVariable(d->varDecl()->var()));\r
     }\r
     if (d->funcDecl() != nullptr)\r
     {\r
-      result.functions.push_back(getFunction(d->funcDecl()->func()));\r
+      result.functions.push_back(getFunction(d->funcDecl()->func(), result.ctx));\r
     }\r
     if (d->structDecl() != nullptr)\r
     {\r
-      result.structs.push_back(getStruct(d->structDecl()));\r
+      result.structs.push_back(getStruct(d->structDecl(), result.ctx));\r
     }\r
     if (d->namespaceDecl() != nullptr)\r
     {\r
-      result.namespaces.push_back(getNamespace(d->namespaceDecl()));\r
+      result.namespaces.push_back(getNamespace(d->namespaceDecl(), result.ctx));\r
     }\r
   }\r
   return result;\r
@@ -337,7 +341,7 @@ Expr getExpr(TocParser::ExprContext * ctx)
     result = getExpr(dynamic_cast<TocParser::IdentifierExprContext *>(ctx));\r
   return result;\r
 }\r
-Stmt getStmt(TocParser::StmtContext * ctx)\r
+Stmt getStmt(TocParser::StmtContext * ctx, std::shared_ptr<Context> parent)\r
 {\r
   Stmt result;\r
   if (ctx->varDecl() != nullptr && ctx->varDecl()->var()->expr() != nullptr)\r
@@ -351,13 +355,13 @@ Stmt getStmt(TocParser::StmtContext * ctx)
   {\r
     result.type = StmtType::If;\r
     result._if.condition = getExpr(ctx->ifStmt()->expr());\r
-    result._if.body = getBody(ctx->ifStmt()->body());\r
+    result._if.body = getBody(ctx->ifStmt()->body(), parent);\r
     for (auto ei : ctx->ifStmt()->elseIfStmt())\r
     {\r
       result._if.elses.emplace_back(\r
         true,\r
         std::make_unique<Expr>(getExpr(ei->expr())),\r
-        getBody(ei->body())\r
+        getBody(ei->body(), parent)\r
       );\r
     }\r
     if (ctx->ifStmt()->elseStmt() != nullptr)\r
@@ -365,7 +369,7 @@ Stmt getStmt(TocParser::StmtContext * ctx)
       result._if.elses.emplace_back(\r
         false,\r
         nullptr,\r
-        getBody(ctx->ifStmt()->elseStmt()->body())\r
+        getBody(ctx->ifStmt()->elseStmt()->body(), parent)\r
       );\r
     }\r
   }\r
@@ -377,7 +381,7 @@ Stmt getStmt(TocParser::StmtContext * ctx)
     {\r
       result._switch.cases.emplace_back(\r
         std::make_unique<Expr>(getExpr(c->expr())),\r
-        getBody(c->body())\r
+        getBody(c->body(), parent)\r
       );\r
     }\r
   }\r
@@ -390,13 +394,13 @@ Stmt getStmt(TocParser::StmtContext * ctx)
     result._for.init->rexpr = getExpr(ctx->forStmt()->varInit()->expr());\r
     result._for.condition = std::make_unique<Expr>(getExpr(ctx->forStmt()->expr(0)));\r
     result._for.action = std::make_unique<Expr>(getExpr(ctx->forStmt()->expr(1)));\r
-    result._for.body = getBody(ctx->forStmt()->body());\r
+    result._for.body = getBody(ctx->forStmt()->body(), parent);\r
   }\r
   if (ctx->whileStmt() != nullptr)\r
   {\r
     result.type = StmtType::While;\r
     result._while.condition = getExpr(ctx->whileStmt()->expr());\r
-    result._while.body = getBody(ctx->whileStmt()->body());\r
+    result._while.body = getBody(ctx->whileStmt()->body(), parent);\r
   }\r
   if (ctx->assignStmt() != nullptr)\r
   {\r
index 95c24d8beb795b7926e7705dacd11f0de7bc7723..43ab1bad3831c508f50cf83868003b342d8860e8 100644 (file)
--- a/src/toc.h
+++ b/src/toc.h
@@ -96,7 +96,7 @@ std::ostream & operator<< (std::ostream & out, const Body & b)
   out << "{\n";\r
   indentation += 2;\r
 \r
-  for (auto v : b.variables)\r
+  for (auto v : b.ctx->variables)\r
   {\r
     indent(out);\r
     out << v << ";\n";\r
@@ -279,7 +279,7 @@ void tocProgram (std::ostream & out, const Program & p)
     tocFunction(out, f, true);\r
   }\r
 \r
-  for (auto v : p.variables)\r
+  for (auto v : p.ctx->variables)\r
   {\r
     out << v << ";\n";\r
   }\r
@@ -303,7 +303,7 @@ void tocNamespace  (std::ostream & out, const Namespace & n, bool stub)
   namespaces.push_back(n.name);\r
   if (!stub)\r
   {\r
-    for (auto v : n.variables)\r
+    for (auto v : n.ctx->variables)\r
     {\r
       out << v << ";\n";\r
     }\r