Skip to content

Commit

Permalink
reporterror
Browse files Browse the repository at this point in the history
  • Loading branch information
rechardchen committed May 26, 2017
1 parent 69175d1 commit 3b46fcc
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 63 deletions.
29 changes: 28 additions & 1 deletion absyn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ namespace tiger
{
public:
virtual antlrcpp::Any visitNilExp(tigerParser::NilExpContext *ctx) override {
auto exp = new NilExp;
return ASTNode(new NilExp);
}
virtual antlrcpp::Any visitIntExp(tigerParser::IntExpContext *ctx) override {
Expand All @@ -78,6 +79,7 @@ namespace tiger
exp->type = ctx->type_id()->getText();
exp->size = visit(ctx->exp(0));
exp->init = visit(ctx->exp(1));
exp->sl = ctx->type_id()->ID()->getSymbol()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitRecordExp(tigerParser::RecordExpContext *ctx) override {
Expand All @@ -91,8 +93,11 @@ namespace tiger
auto efield = new EField;
efield->name = ids[i]->getText();
efield->exp = visit(values[i]);
efield->sl = ids[i]->getSymbol()->getLine();
exp->fields.push_back(ASTNode(efield));
}
exp->sl = ctx->type_id()->ID()->getSymbol()->getLine();

return ASTNode(exp);
}
virtual antlrcpp::Any visitNewExp(tigerParser::NewExpContext *ctx) override {
Expand All @@ -108,6 +113,7 @@ namespace tiger
exp->name = ctx->ID()->getText();
auto params = ctx->exp();
for (auto e : params) exp->params.push_back(visit(e));
exp->sl = ctx->ID()->getSymbol()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitMethodCallExp(tigerParser::MethodCallExpContext *ctx) override {
Expand All @@ -122,6 +128,7 @@ namespace tiger
auto exp = new UnaryOpExp;
exp->op = UnaryOpExp::OP_NEG;
exp->exp = visit(ctx->exp());
exp->sl = ctx->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitMulDivExp(tigerParser::MulDivExpContext *ctx) override {
Expand All @@ -130,6 +137,7 @@ namespace tiger
exp->op = opTxt == "*" ? BinOpExp::OP_MUL : BinOpExp::OP_DIV;
exp->lhs = visit(ctx->exp(0));
exp->rhs = visit(ctx->exp(1));
exp->sl = ctx->op->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitAddSubExp(tigerParser::AddSubExpContext *ctx) override {
Expand All @@ -138,6 +146,7 @@ namespace tiger
exp->op = opTxt == "+" ? BinOpExp::OP_ADD : BinOpExp::OP_SUB;
exp->lhs = visit(ctx->exp(0));
exp->rhs = visit(ctx->exp(1));
exp->sl = ctx->op->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitRelOpExp(tigerParser::RelOpExpContext *ctx) override {
Expand All @@ -157,6 +166,7 @@ namespace tiger
exp->op = BinOpExp::OP_LT;
exp->lhs = visit(ctx->exp(0));
exp->rhs = visit(ctx->exp(1));
exp->sl = ctx->op->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitLogicExp(tigerParser::LogicExpContext *ctx) override {
Expand All @@ -165,6 +175,7 @@ namespace tiger
exp->op = opTxt == "&" ? BinOpExp::OP_AND : BinOpExp::OP_OR;
exp->lhs = visit(ctx->exp(0));
exp->rhs = visit(ctx->exp(1));
exp->sl = ctx->op->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitExplistExp(tigerParser::ExplistExpContext *ctx) override {
Expand All @@ -174,6 +185,7 @@ namespace tiger
auto exp = new AssignExp;
exp->var = visit(ctx->lvalue());
exp->exp = visit(ctx->exp());
exp->sl = ctx->lvalue()->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitIfExp(tigerParser::IfExpContext *ctx) override {
Expand All @@ -183,12 +195,14 @@ namespace tiger
auto elsee = ctx->exp(2);
if (elsee)
exp->elsee = visit(elsee);
exp->sl = ctx->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitWhileExp(tigerParser::WhileExpContext *ctx) override {
auto exp = new WhileExp;
exp->test = visit(ctx->exp(0));
exp->body = visit(ctx->exp(1));
exp->sl = ctx->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitForExp(tigerParser::ForExpContext *ctx) override {
Expand All @@ -197,10 +211,13 @@ namespace tiger
exp->lo = visit(ctx->exp(0));
exp->hi = visit(ctx->exp(1));
exp->body = visit(ctx->exp(2));
exp->sl = ctx->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitBreakExp(tigerParser::BreakExpContext *ctx) override {
return ASTNode(new BreakExp);
auto exp = new BreakExp;
exp->sl = ctx->getStart()->getLine();
return ASTNode(exp);
}
virtual antlrcpp::Any visitLetExp(tigerParser::LetExpContext *ctx) override {
auto exp = new LetExp;
Expand All @@ -211,18 +228,21 @@ namespace tiger
virtual antlrcpp::Any visitSimpleVar(tigerParser::SimpleVarContext *ctx) override {
auto var = new SimpleVar;
var->name = ctx->ID()->getText();
var->sl = ctx->ID()->getSymbol()->getLine();
return ASTNode(var);
}
virtual antlrcpp::Any visitFieldVar(tigerParser::FieldVarContext *ctx) override {
auto var = new FieldVar;
var->var = visit(ctx->lvalue());
var->field = ctx->ID()->getText();
var->sl = ctx->dot->getLine();
return ASTNode(var);
}
virtual antlrcpp::Any visitSubScriptVar(tigerParser::SubScriptVarContext *ctx) override {
auto var = new SubscriptVar;
var->var = visit(ctx->lvalue());
var->exp = visit(ctx->exp());
var->sl = ctx->lbt->getLine();
return ASTNode(var);
}
virtual antlrcpp::Any visitExprList(tigerParser::ExprListContext *ctx) override {
Expand All @@ -243,6 +263,7 @@ namespace tiger
auto typedec = new TypeDec;
typedec->name = ctx->ID()->getText();
typedec->ty = visit(ctx->ty());
typedec->sl = ctx->ID()->getSymbol()->getLine();
return ASTNode(typedec);
}
virtual antlrcpp::Any visitClassDec(tigerParser::ClassDecContext *ctx) override {
Expand All @@ -267,6 +288,7 @@ namespace tiger
auto rtype = ctx->type_id();
fundec->rtype = rtype ? rtype->getText() : "";
fundec->body = visit(ctx->exp());
fundec->sl = ctx->ID()->getSymbol()->getLine();
return ASTNode(fundec);
}
virtual antlrcpp::Any visitImportDec(tigerParser::ImportDecContext *ctx) override {
Expand All @@ -277,18 +299,21 @@ namespace tiger
virtual antlrcpp::Any visitNameTy(tigerParser::NameTyContext *ctx) override {
auto nameTy = new NameTy;
nameTy->name = ctx->type_id()->getText();
nameTy->sl = ctx->type_id()->ID()->getSymbol()->getLine();
return ASTNode(nameTy);
}
virtual antlrcpp::Any visitRecordTy(tigerParser::RecordTyContext *ctx) override {
auto recordTy = new RecordTy;
ASTNode tmp = visit(ctx->tyfields());
assert(tmp->type == A_TyFields);
recordTy->tyfields = static_cast<TyFields*>(tmp);
recordTy->sl = ctx->tyfields()->getStart()->getLine();
return ASTNode(recordTy);
}
virtual antlrcpp::Any visitArrayTy(tigerParser::ArrayTyContext *ctx) override {
auto arrayTy = new ArrayTy;
arrayTy->type = ctx->type_id()->getText();
arrayTy->sl = ctx->type_id()->ID()->getSymbol()->getLine();
return ASTNode(arrayTy);
}
virtual antlrcpp::Any visitClassTy(tigerParser::ClassTyContext *ctx) override {
Expand All @@ -307,6 +332,7 @@ namespace tiger
auto field = new Field;
field->name = ids[i]->getText();
field->type = typeids[i]->getText();
field->sl = ids[i]->getSymbol()->getLine();
tyfields->fields.push_back(field);
}
return ASTNode(tyfields);
Expand All @@ -330,6 +356,7 @@ namespace tiger
auto _type = ctx->type_id();
var->type = _type ? _type->getText() : "";
var->init = visit(ctx->exp());
var->sl = ctx->ID()->getSymbol()->getLine();
return ASTNode(var);
}
};
Expand Down
1 change: 1 addition & 0 deletions absyn.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ namespace tiger
{
BaseASTNode(int _type=A_Invalid) :type(_type) {}
const int type;
int sl = 0; //source line, error report only like VC
};
struct NilExp : public BaseASTNode { NilExp() :BaseASTNode(A_Nil) {} };
struct StringExp : public BaseASTNode
Expand Down
4 changes: 2 additions & 2 deletions grammar/tigerParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1092,7 +1092,7 @@ tigerParser::LvalueContext* tigerParser::lvalue(int precedence) {

if (!(precpred(_ctx, 2))) throw FailedPredicateException(this, "precpred(_ctx, 2)");
setState(149);
match(tigerParser::T__11);
dynamic_cast<FieldVarContext *>(_localctx)->dot = match(tigerParser::T__11);
setState(150);
match(tigerParser::ID);
break;
Expand All @@ -1106,7 +1106,7 @@ tigerParser::LvalueContext* tigerParser::lvalue(int precedence) {

if (!(precpred(_ctx, 1))) throw FailedPredicateException(this, "precpred(_ctx, 1)");
setState(152);
match(tigerParser::T__1);
dynamic_cast<SubScriptVarContext *>(_localctx)->lbt = match(tigerParser::T__1);
setState(153);
exp(0);
setState(154);
Expand Down
2 changes: 2 additions & 0 deletions grammar/tigerParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ class tigerParser : public antlr4::Parser {
public:
FieldVarContext(LvalueContext *ctx);

antlr4::Token *dot = nullptr;
LvalueContext *lvalue();
antlr4::tree::TerminalNode *ID();
virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
Expand All @@ -303,6 +304,7 @@ class tigerParser : public antlr4::Parser {
public:
SubScriptVarContext(LvalueContext *ctx);

antlr4::Token *lbt = nullptr;
LvalueContext *lvalue();
ExpContext *exp();
virtual antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
Expand Down
1 change: 1 addition & 0 deletions samples/test2.tig
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* arr1 is valid since expression 0 is int = myint */
let
type myint = a
type a = myint
type arrtype = array of myint

var arr1:arrtype := arrtype [10] of 0
Expand Down
Loading

0 comments on commit 3b46fcc

Please sign in to comment.