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
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
}\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
}\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
}\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
}\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
}\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