abouttreesummaryrefslogcommitdiff
path: root/src/repr_get.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/repr_get.h')
-rw-r--r--src/repr_get.h240
1 files changed, 160 insertions, 80 deletions
diff --git a/src/repr_get.h b/src/repr_get.h
index 70ae3b1..118d7b3 100644
--- a/src/repr_get.h
+++ b/src/repr_get.h
@@ -18,10 +18,12 @@ Expr getExpr(TocParser::NonAccessExprContext * ctx);
Expr getExpr(TocParser::ExprContext * ctx);
Stmt getStmt(TocParser::StmtContext * ctx);
-Type getType(TocParser::TypeContext * ctx) {
+Type getType(TocParser::TypeContext * ctx)
+{
Type result;
result.name = ctx->typeName()->NAME()->toString();
- for (auto m : ctx->typeModifier()) {
+ for (auto m : ctx->typeModifier())
+ {
bool isPointer = m->getText() == "*";
bool isStaticArray = m->INT_LIT() != nullptr;
@@ -33,82 +35,105 @@ Type getType(TocParser::TypeContext * ctx) {
}
return result;
}
-Variable getVariable(TocParser::VarContext * ctx) {
+Variable getVariable(TocParser::VarContext * ctx)
+{
Variable result;
result.name = ctx->varName()->NAME()->toString();
result.type = getType(ctx->type());
return result;
}
-Body getBody(TocParser::BodyContext * ctx) {
+Body getBody(TocParser::BodyContext * ctx)
+{
Body result;
- for (auto s : ctx->stmt()) {
- if (s->varDecl() != nullptr) {
+ for (auto s : ctx->stmt())
+ {
+ if (s->varDecl() != nullptr)
+ {
result.variables.push_back(getVariable(s->varDecl()->var()));
if (s->varDecl()->var()->expr() != nullptr)
result.statements.push_back(getStmt(s));
}
- else {
+ else
+ {
result.statements.push_back(getStmt(s));
}
}
return result;
}
-Function getFunction(TocParser::FuncContext * ctx) {
+Function getFunction(TocParser::FuncContext * ctx)
+{
Function result;
result.name = ctx->funcName()->NAME()->toString();
result.returnType = getType(ctx->type());
- if (!ctx->parameter()->var().empty()) {
+ if (!ctx->parameter()->var().empty())
+ {
for (auto p : ctx->parameter()->var())
result.parameters.push_back(getVariable(p));
}
result.body = getBody(ctx->body());
return result;
}
-Struct getStruct(TocParser::StructDeclContext * ctx) {
+Struct getStruct(TocParser::StructDeclContext * ctx)
+{
Struct result;
result.name = ctx->structName()->NAME()->toString();
- for (auto m : ctx->structMember()) {
- if (m->structVar() != nullptr) {
+ for (auto m : ctx->structMember())
+ {
+ if (m->structVar() != nullptr)
+ {
result.members.push_back(getVariable(m->structVar()->var()));
}
- if (m->structMethod() != nullptr) {
+ if (m->structMethod() != nullptr)
+ {
result.methods.push_back(getFunction(m->structMethod()->func()));
}
}
return result;
}
-Program getProgram(TocParser::ProgContext * ctx) {
+Program getProgram(TocParser::ProgContext * ctx)
+{
Program result;
- for (auto d : ctx->decl()) {
- if (d->varDecl() != nullptr) {
+ for (auto d : ctx->decl())
+ {
+ if (d->varDecl() != nullptr)
+ {
result.variables.push_back(getVariable(d->varDecl()->var()));
}
- if (d->funcDecl() != nullptr) {
+ if (d->funcDecl() != nullptr)
+ {
result.functions.push_back(getFunction(d->funcDecl()->func()));
}
- if (d->structDecl() != nullptr) {
+ if (d->structDecl() != nullptr)
+ {
result.structs.push_back(getStruct(d->structDecl()));
}
}
return result;
}
-UnaryOperatorType getUnaryOperatorType(const std::string & s) {
- for (int i = 0; i < (int)UnaryOperatorType::COUNT; i++) {
- if (UnaryOperatorTypeStrings[i] == s) {
+UnaryOperatorType getUnaryOperatorType(const std::string & s)
+{
+ for (int i = 0; i < (int)UnaryOperatorType::COUNT; i++)
+ {
+ if (UnaryOperatorTypeStrings[i] == s)
+ {
return (UnaryOperatorType)i;
}
}
return UnaryOperatorType::COUNT;
}
-BinaryOperatorType getBinaryOperatorType(const std::string & s) {
- for (int i = 0; i < (int)BinaryOperatorType::COUNT; i++) {
- if (BinaryOperatorTypeStrings[i] == s) {
+BinaryOperatorType getBinaryOperatorType(const std::string & s)
+{
+ for (int i = 0; i < (int)BinaryOperatorType::COUNT; i++)
+ {
+ if (BinaryOperatorTypeStrings[i] == s)
+ {
return (BinaryOperatorType)i;
}
}
return BinaryOperatorType::COUNT;
}
-UnaryOperatorExpr getUnaryOperatorExpr(TocParser::OpExprContext * ctx) {
+UnaryOperatorExpr getUnaryOperatorExpr(TocParser::OpExprContext * ctx)
+{
UnaryOperatorExpr result;
if (ctx->prefixOp() != nullptr)
result.expr = std::make_unique<Expr>(getExpr(ctx->prefixOp()->nonOpExpr()));
@@ -127,7 +152,8 @@ UnaryOperatorExpr getUnaryOperatorExpr(TocParser::OpExprContext * ctx) {
return result;
}
-BinaryOperatorExpr getBinaryOperatorExpr(TocParser::OpExprContext * ctx) {
+BinaryOperatorExpr getBinaryOperatorExpr(TocParser::OpExprContext * ctx)
+{
BinaryOperatorExpr result;
result.lexpr = std::make_unique<Expr>(getExpr(ctx->binaryOp()->nonOpExpr(0)));
result.rexpr = std::make_unique<Expr>(getExpr(ctx->binaryOp()->nonOpExpr(1)));
@@ -138,70 +164,86 @@ BinaryOperatorExpr getBinaryOperatorExpr(TocParser::OpExprContext * ctx) {
return result;
}
-TernaryOperatorExpr getTernaryOperatorExpr(TocParser::OpExprContext * ctx) {
+TernaryOperatorExpr getTernaryOperatorExpr(TocParser::OpExprContext * ctx)
+{
TernaryOperatorExpr result;
result.lexpr = std::make_unique<Expr>(getExpr(ctx->ternaryOp()->nonOpExpr()));
result.rexprTrue = std::make_unique<Expr>(getExpr(ctx->ternaryOp()->expr(0)));
result.rexprFalse = std::make_unique<Expr>(getExpr(ctx->ternaryOp()->expr(1)));
return result;
}
-Expr getExpr(TocParser::NonOpExprContext * ctx) {
+Expr getExpr(TocParser::NonOpExprContext * ctx)
+{
Expr result;
result.parenthesized = false;
- if (ctx->funcExpr() != nullptr) {
+ if (ctx->funcExpr() != nullptr)
+ {
result.type = ExprType::Func;
result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();
for (auto e : ctx->funcExpr()->expr())
result._func.arguments.push_back(getExpr(e));
}
- if (ctx->litExpr() != nullptr) {
+ if (ctx->litExpr() != nullptr)
+ {
result.type = ExprType::Lit;
- if (ctx->litExpr()->INT_LIT() != nullptr) {
+ if (ctx->litExpr()->INT_LIT() != nullptr)
+ {
result._lit.type = LitType::Int;
result._lit._int = atoi(ctx->litExpr()->INT_LIT()->toString().c_str());
}
- else if (ctx->litExpr()->DECIMAL_LIT() != nullptr) {
+ else if (ctx->litExpr()->DECIMAL_LIT() != nullptr)
+ {
result._lit.type = LitType::Decimal;
result._lit._decimal = atof(ctx->litExpr()->DECIMAL_LIT()->toString().c_str());
}
- else if (ctx->litExpr()->STRING_LIT() != nullptr) {
+ else if (ctx->litExpr()->STRING_LIT() != nullptr)
+ {
result._lit.type = LitType::String;
result._lit._string = ctx->litExpr()->STRING_LIT()->toString();
}
- else if (ctx->litExpr()->BOOL_LIT() != nullptr) {
+ else if (ctx->litExpr()->BOOL_LIT() != nullptr)
+ {
result._lit.type = LitType::Bool;
result._lit._bool = ctx->litExpr()->BOOL_LIT()->toString() == "true";
}
}
- if (ctx->identifierExpr() != nullptr) {
+ if (ctx->identifierExpr() != nullptr)
+ {
result.type = ExprType::Identifier;
result._identifier.name = ctx->identifierExpr()->varName()->NAME()->toString();
}
- if (ctx->parenExpr() != nullptr) {
+ if (ctx->parenExpr() != nullptr)
+ {
result = getExpr(ctx->parenExpr()->expr());
result.parenthesized = true;
}
- if (ctx->accessExpr() != nullptr) {
+ if (ctx->accessExpr() != nullptr)
+ {
auto firstSub = ctx->accessExpr()->accessSubExpr(0);
- if (firstSub->accessMember() != nullptr) {
+ if (firstSub->accessMember() != nullptr)
+ {
result.type = ExprType::Dot;
result._dot.expr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));
result._dot.ident.name = firstSub->accessMember()->identifierExpr()->varName()->NAME()->toString();
}
- else {
+ else
+ {
result.type = ExprType::Brackets;
result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));
result._brackets.rexpr = std::make_unique<Expr>(getExpr(firstSub->accessBrackets()->expr()));
}
- for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++) {
+ for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++)
+ {
Expr tmp = result;
auto sub = ctx->accessExpr()->accessSubExpr(i);
- if (sub->accessMember() != nullptr) {
+ if (sub->accessMember() != nullptr)
+ {
result.type = ExprType::Dot;
result._dot.expr = std::make_unique<Expr>(tmp);
result._dot.ident.name = sub->accessMember()->identifierExpr()->varName()->NAME()->toString();
}
- else {
+ else
+ {
result.type = ExprType::Brackets;
result._brackets.lexpr = std::make_unique<Expr>(tmp);
result._brackets.rexpr = std::make_unique<Expr>(getExpr(sub->accessBrackets()->expr()));
@@ -210,129 +252,158 @@ Expr getExpr(TocParser::NonOpExprContext * ctx) {
}
return result;
}
-Expr getExpr(TocParser::NonAccessExprContext * ctx) {
+Expr getExpr(TocParser::NonAccessExprContext * ctx)
+{
Expr result;
result.parenthesized = false;
- if (ctx->funcExpr() != nullptr) {
+ if (ctx->funcExpr() != nullptr)
+ {
result.type = ExprType::Func;
result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();
for (auto e : ctx->funcExpr()->expr())
result._func.arguments.push_back(getExpr(e));
}
- if (ctx->identifierExpr() != nullptr) {
+ if (ctx->identifierExpr() != nullptr)
+ {
result.type = ExprType::Identifier;
result._identifier.name = ctx->identifierExpr()->varName()->NAME()->toString();
}
- if (ctx->parenExpr() != nullptr) {
+ if (ctx->parenExpr() != nullptr)
+ {
result = getExpr(ctx->parenExpr()->expr());
result.parenthesized = true;
}
return result;
}
-Expr getExpr(TocParser::ExprContext * ctx) {
+Expr getExpr(TocParser::ExprContext * ctx)
+{
Expr result;
result.parenthesized = false;
- if (ctx->funcExpr() != nullptr) {
+ if (ctx->funcExpr() != nullptr)
+ {
result.type = ExprType::Func;
result._func.functionName = ctx->funcExpr()->funcName()->NAME()->toString();
for (auto e : ctx->funcExpr()->expr())
result._func.arguments.push_back(getExpr(e));
}
- if (ctx->litExpr() != nullptr) {
+ if (ctx->litExpr() != nullptr)
+ {
result.type = ExprType::Lit;
- if (ctx->litExpr()->INT_LIT() != nullptr) {
+ if (ctx->litExpr()->INT_LIT() != nullptr)
+ {
result._lit.type = LitType::Int;
result._lit._int = atoi(ctx->litExpr()->INT_LIT()->toString().c_str());
}
- else if (ctx->litExpr()->DECIMAL_LIT() != nullptr) {
+ else if (ctx->litExpr()->DECIMAL_LIT() != nullptr)
+ {
result._lit.type = LitType::Decimal;
result._lit._decimal = atof(ctx->litExpr()->DECIMAL_LIT()->toString().c_str());
}
- else if (ctx->litExpr()->STRING_LIT() != nullptr) {
+ else if (ctx->litExpr()->STRING_LIT() != nullptr)
+ {
result._lit.type = LitType::String;
result._lit._string = ctx->litExpr()->STRING_LIT()->toString();
}
- else if (ctx->litExpr()->BOOL_LIT() != nullptr) {
+ else if (ctx->litExpr()->BOOL_LIT() != nullptr)
+ {
result._lit.type = LitType::Bool;
result._lit._bool = ctx->litExpr()->BOOL_LIT()->toString() == "true";
}
}
- if (ctx->identifierExpr() != nullptr) {
+ if (ctx->identifierExpr() != nullptr)
+ {
result.type = ExprType::Identifier;
result._identifier.name = ctx->identifierExpr()->varName()->NAME()->toString();
}
- if (ctx->parenExpr() != nullptr) {
+ if (ctx->parenExpr() != nullptr)
+ {
result = getExpr(ctx->parenExpr()->expr());
result.parenthesized = true;
}
- if (ctx->accessExpr() != nullptr) {
+ if (ctx->accessExpr() != nullptr)
+ {
auto firstSub = ctx->accessExpr()->accessSubExpr(0);
- if (firstSub->accessMember() != nullptr) {
+ if (firstSub->accessMember() != nullptr)
+ {
result.type = ExprType::Dot;
result._dot.expr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));
result._dot.ident.name = firstSub->accessMember()->identifierExpr()->varName()->NAME()->toString();
}
- else {
+ else
+ {
result.type = ExprType::Brackets;
result._brackets.lexpr = std::make_unique<Expr>(getExpr(ctx->accessExpr()->nonAccessExpr()));
result._brackets.rexpr = std::make_unique<Expr>(getExpr(firstSub->accessBrackets()->expr()));
}
- for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++) {
+ for (int i = 1; i < ctx->accessExpr()->accessSubExpr().size(); i++)
+ {
Expr tmp = result;
auto sub = ctx->accessExpr()->accessSubExpr(i);
- if (sub->accessMember() != nullptr) {
+ if (sub->accessMember() != nullptr)
+ {
result.type = ExprType::Dot;
result._dot.expr = std::make_unique<Expr>(tmp);
result._dot.ident.name = sub->accessMember()->identifierExpr()->varName()->NAME()->toString();
}
- else {
+ else
+ {
result.type = ExprType::Brackets;
result._brackets.lexpr = std::make_unique<Expr>(tmp);
result._brackets.rexpr = std::make_unique<Expr>(getExpr(sub->accessBrackets()->expr()));
}
}
}
- if (ctx->opExpr() != nullptr) {
- if (ctx->opExpr()->prefixOp() != nullptr || ctx->opExpr()->postfixOp() != nullptr) {
+ if (ctx->opExpr() != nullptr)
+ {
+ if (ctx->opExpr()->prefixOp() != nullptr || ctx->opExpr()->postfixOp() != nullptr)
+ {
result.type = ExprType::UnaryOperator;
result._unaryOperator = getUnaryOperatorExpr(ctx->opExpr());
}
- else if (ctx->opExpr()->binaryOp() != nullptr) {
+ else if (ctx->opExpr()->binaryOp() != nullptr)
+ {
result.type = ExprType::BinaryOperator;
result._binaryOperator = getBinaryOperatorExpr(ctx->opExpr());
- for (int i = 1; i < ctx->opExpr()->binaryOp()->binary_op().size(); i++) {
+ for (int i = 1; i < ctx->opExpr()->binaryOp()->binary_op().size(); i++)
+ {
Expr tmp = result;
result._binaryOperator.lexpr = std::make_unique<Expr>(tmp);
result._binaryOperator.type = getBinaryOperatorType(ctx->opExpr()->binaryOp()->binary_op(i)->getText());
result._binaryOperator.rexpr = std::make_unique<Expr>(getExpr(ctx->opExpr()->binaryOp()->nonOpExpr(i+1)));
}
}
- else if (ctx->opExpr()->ternaryOp() != nullptr) {
+ else if (ctx->opExpr()->ternaryOp() != nullptr)
+ {
result.type = ExprType::TernaryOperator;
result._ternaryOperator = getTernaryOperatorExpr(ctx->opExpr());
}
}
return result;
}
-Stmt getStmt(TocParser::StmtContext * ctx) {
+Stmt getStmt(TocParser::StmtContext * ctx)
+{
Stmt result;
- if (ctx->varDecl() != nullptr && ctx->varDecl()->var()->expr() != nullptr) {
+ if (ctx->varDecl() != nullptr && ctx->varDecl()->var()->expr() != nullptr)
+ {
result.type = StmtType::Assign;
result._assign.name = ctx->varDecl()->var()->varName()->NAME()->toString();
result._assign.expr = getExpr(ctx->varDecl()->var()->expr());
}
- if (ctx->ifStmt() != nullptr) {
+ if (ctx->ifStmt() != nullptr)
+ {
result.type = StmtType::If;
result._if.condition = getExpr(ctx->ifStmt()->expr());
result._if.body = getBody(ctx->ifStmt()->body());
- for (auto ei : ctx->ifStmt()->elseIfStmt()) {
+ for (auto ei : ctx->ifStmt()->elseIfStmt())
+ {
result._if.elses.emplace_back(
true,
std::make_unique<Expr>(getExpr(ei->expr())),
getBody(ei->body())
);
}
- if (ctx->ifStmt()->elseStmt() != nullptr) {
+ if (ctx->ifStmt()->elseStmt() != nullptr)
+ {
result._if.elses.emplace_back(
false,
nullptr,
@@ -340,23 +411,28 @@ Stmt getStmt(TocParser::StmtContext * ctx) {
);
}
}
- if (ctx->switchStmt() != nullptr) {
+ if (ctx->switchStmt() != nullptr)
+ {
result.type = StmtType::Switch;
result._switch.ident.name = ctx->switchStmt()->identifierExpr()->varName()->NAME()->toString();
- for (auto c : ctx->switchStmt()->switchBody()->switchCase()) {
+ for (auto c : ctx->switchStmt()->switchBody()->switchCase())
+ {
result._switch.cases.emplace_back(
std::make_unique<Expr>(getExpr(c->expr())),
getBody(c->body())
);
}
}
- if (ctx->forStmt() != nullptr) {
+ if (ctx->forStmt() != nullptr)
+ {
result.type = StmtType::For;
- if (ctx->forStmt()->varInit() != nullptr) {
+ if (ctx->forStmt()->varInit() != nullptr)
+ {
result._for.varName = ctx->forStmt()->varInit()->varName()->NAME()->toString();
result._for.initValue = std::make_unique<Expr>(getExpr(ctx->forStmt()->varInit()->expr()));
}
- else {
+ else
+ {
result._for.varName = ctx->forStmt()->assignStmt()->identifierExpr()->varName()->NAME()->toString();
result._for.initValue = std::make_unique<Expr>(getExpr(ctx->forStmt()->assignStmt()->expr()));
}
@@ -364,21 +440,25 @@ Stmt getStmt(TocParser::StmtContext * ctx) {
result._for.action = std::make_unique<Expr>(getExpr(ctx->forStmt()->expr(1)));
result._for.body = getBody(ctx->forStmt()->body());
}
- if (ctx->whileStmt() != nullptr) {
+ if (ctx->whileStmt() != nullptr)
+ {
result.type = StmtType::While;
result._while.condition = getExpr(ctx->whileStmt()->expr());
result._while.body = getBody(ctx->whileStmt()->body());
}
- if (ctx->assignStmt() != nullptr) {
+ if (ctx->assignStmt() != nullptr)
+ {
result.type = StmtType::Assign;
result._assign.name = ctx->assignStmt()->identifierExpr()->varName()->NAME()->toString();
result._assign.expr = getExpr(ctx->assignStmt()->expr());
}
- if (ctx->returnStmt() != nullptr) {
+ if (ctx->returnStmt() != nullptr)
+ {
result.type = StmtType::Return;
result._return.expr = getExpr(ctx->returnStmt()->expr());
}
- if (ctx->expr() != nullptr) {
+ if (ctx->expr() != nullptr)
+ {
result.type = StmtType::Expr;
result._expr = getExpr(ctx->expr());
}