]> gitweb.ps.run Git - toc/blobdiff - src/repr_get.h
type modifiers, parenthesized expressions, chained access expressions
[toc] / src / repr_get.h
index b624e4c773525ee3c10bdd4aca3fae1a8d714542..70ae3b1c2a2fe77bfca563d4160a9e45ec4b6e11 100644 (file)
@@ -22,9 +22,13 @@ Type getType(TocParser::TypeContext * ctx) {
   Type result;\r
   result.name = ctx->typeName()->NAME()->toString();\r
   for (auto m : ctx->typeModifier()) {\r
+    bool isPointer = m->getText() == "*";\r
+    bool isStaticArray = m->INT_LIT() != nullptr;\r
+\r
     result.modifiers.emplace_back(\r
-      m->toString() == "*" ? TypeModifierType::Pointer : TypeModifierType::Array,\r
-      m->toString() == "*" ? -1 : atoi(m->NUMBER()->toString().c_str())\r
+      isPointer ? TypeModifierType::Pointer : TypeModifierType::Array,\r
+      isStaticArray,\r
+      isStaticArray ? atoi(m->INT_LIT()->toString().c_str()) : -1\r
     );\r
   }\r
   return result;\r
@@ -129,7 +133,6 @@ BinaryOperatorExpr getBinaryOperatorExpr(TocParser::OpExprContext * ctx) {
   result.rexpr = std::make_unique<Expr>(getExpr(ctx->binaryOp()->nonOpExpr(1)));\r
   \r
   std::string op = ctx->binaryOp()->binary_op(0)->getText();\r
-  std::cout << op << std::endl;\r
 \r
   result.type = getBinaryOperatorType(op);\r
 \r
@@ -144,6 +147,7 @@ TernaryOperatorExpr getTernaryOperatorExpr(TocParser::OpExprContext * ctx) {
 }\r
 Expr getExpr(TocParser::NonOpExprContext * ctx) {\r
   Expr result;\r
+  result.parenthesized = false;\r
   if (ctx->funcExpr() != nullptr) {\r
     result.type = ExprType::Func;\r
     result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();\r
@@ -175,17 +179,31 @@ Expr getExpr(TocParser::NonOpExprContext * ctx) {
   }\r
   if (ctx->parenExpr() != nullptr) {\r
     result = getExpr(ctx->parenExpr()->expr());\r
+    result.parenthesized = true;\r
   }\r
   if (ctx->accessExpr() != nullptr) {\r
-    // TODO: access chain\r
-    for (auto sub : ctx->accessExpr()->accessSubExpr()) {\r
+    auto firstSub = ctx->accessExpr()->accessSubExpr(0);\r
+    if (firstSub->accessMember() != nullptr) {\r
+      result.type = ExprType::Dot;\r
+      result._dot.expr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+      result._dot.ident.name = firstSub->accessMember()->identifierExpr()->varName()->NAME()->toString();\r
+    }\r
+    else {\r
+      result.type = ExprType::Brackets;\r
+      result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+      result._brackets.rexpr = std::make_unique<Expr>(getExpr(firstSub->accessBrackets()->expr()));\r
+    }\r
+    for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++) {\r
+      Expr tmp = result;\r
+      auto sub = ctx->accessExpr()->accessSubExpr(i);\r
       if (sub->accessMember() != nullptr) {\r
         result.type = ExprType::Dot;\r
+        result._dot.expr = std::make_unique<Expr>(tmp);\r
         result._dot.ident.name = sub->accessMember()->identifierExpr()->varName()->NAME()->toString();\r
       }\r
       else {\r
         result.type = ExprType::Brackets;\r
-        result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+        result._brackets.lexpr = std::make_unique<Expr>(tmp);\r
         result._brackets.rexpr = std::make_unique<Expr>(getExpr(sub->accessBrackets()->expr()));\r
       }\r
     }\r
@@ -194,6 +212,7 @@ Expr getExpr(TocParser::NonOpExprContext * ctx) {
 }\r
 Expr getExpr(TocParser::NonAccessExprContext * ctx) {\r
   Expr result;\r
+  result.parenthesized = false;\r
   if (ctx->funcExpr() != nullptr) {\r
     result.type = ExprType::Func;\r
     result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();\r
@@ -206,11 +225,13 @@ Expr getExpr(TocParser::NonAccessExprContext * ctx) {
   }\r
   if (ctx->parenExpr() != nullptr) {\r
     result = getExpr(ctx->parenExpr()->expr());\r
+    result.parenthesized = true;\r
   }\r
   return result;\r
 }\r
 Expr getExpr(TocParser::ExprContext * ctx) {\r
   Expr result;\r
+  result.parenthesized = false;\r
   if (ctx->funcExpr() != nullptr) {\r
     result.type = ExprType::Func;\r
     result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();\r
@@ -242,18 +263,31 @@ Expr getExpr(TocParser::ExprContext * ctx) {
   }\r
   if (ctx->parenExpr() != nullptr) {\r
     result = getExpr(ctx->parenExpr()->expr());\r
+    result.parenthesized = true;\r
   }\r
   if (ctx->accessExpr() != nullptr) {\r
-    // TODO: access chain\r
-    for (auto sub : ctx->accessExpr()->accessSubExpr()) {\r
+    auto firstSub = ctx->accessExpr()->accessSubExpr(0);\r
+    if (firstSub->accessMember() != nullptr) {\r
+      result.type = ExprType::Dot;\r
+      result._dot.expr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+      result._dot.ident.name = firstSub->accessMember()->identifierExpr()->varName()->NAME()->toString();\r
+    }\r
+    else {\r
+      result.type = ExprType::Brackets;\r
+      result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+      result._brackets.rexpr = std::make_unique<Expr>(getExpr(firstSub->accessBrackets()->expr()));\r
+    }\r
+    for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++) {\r
+      Expr tmp = result;\r
+      auto sub = ctx->accessExpr()->accessSubExpr(i);\r
       if (sub->accessMember() != nullptr) {\r
         result.type = ExprType::Dot;\r
-        result._dot.expr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+        result._dot.expr = std::make_unique<Expr>(tmp);\r
         result._dot.ident.name = sub->accessMember()->identifierExpr()->varName()->NAME()->toString();\r
       }\r
       else {\r
         result.type = ExprType::Brackets;\r
-        result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));\r
+        result._brackets.lexpr = std::make_unique<Expr>(tmp);\r
         result._brackets.rexpr = std::make_unique<Expr>(getExpr(sub->accessBrackets()->expr()));\r
       }\r
     }\r