implement else if nesting

This commit is contained in:
2019-11-11 22:27:27 +01:00
parent ea6bde3305
commit 38d34a7cbc
5 changed files with 32 additions and 8 deletions

View File

@@ -42,14 +42,17 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
@Override
public Node visitIf_statement(KlangParser.If_statementContext ctx) {
Node condition = this.visit(ctx.expression());
Node thenBlock = this.visit(ctx.braced_block(0));
Node condition = this.visit(ctx.cond);
Node thenBlock = this.visit(ctx.then);
if (ctx.braced_block().size() > 1) {
Node elseBlock = this.visit(ctx.braced_block(1));
if (ctx.alt != null) {
Node elseBlock = this.visit(ctx.alt);
return new IfStatement((Expression) condition, (Block) thenBlock, (Block) elseBlock);
} else if(ctx.elif != null) {
Node elif = this.visit(ctx.elif);
return new IfStatement((Expression) condition, (Block) thenBlock, (IfStatement) elif);
} else {
return new IfStatement((Expression) condition, (Block) thenBlock, null);
return new IfStatement((Expression) condition, (Block) thenBlock);
}
}

View File

@@ -9,11 +9,25 @@ public class IfStatement extends Statement {
public Expression cond;
public Block then;
public Block alt;
public IfStatement elif;
public IfStatement(Expression cond, Block then, Block alt) {
public IfStatement(Expression cond, Block then, Block alt, IfStatement elif) {
this.cond = cond;
this.then = then;
this.alt = alt;
this.elif = elif;
}
public IfStatement(Expression cond, Block then, Block alt) {
this(cond, then, alt, null);
}
public IfStatement(Expression cond, Block then, IfStatement elif) {
this(cond, then, null, elif);
}
public IfStatement(Expression cond, Block then) {
this(cond, then, null, null);
}
@Override

View File

@@ -49,6 +49,8 @@ public class EvalVisitor implements Visitor<Value> {
e.then.welcome(this);
} else if (e.alt != null) {
e.alt.welcome(this);
} else if (e.elif != null) {
e.elif.welcome(this);
}
return null;
@@ -66,7 +68,9 @@ public class EvalVisitor implements Visitor<Value> {
@Override
public Value visit(Block e) {
// TODO Auto-generated method stub
for (var stmt: e.statements) {
stmt.welcome(this);
}
return null;
}

View File

@@ -99,6 +99,9 @@ public class PrettyPrintVisitor implements Visitor<Void> {
if (e.alt != null) {
ex.write(" else ");
e.alt.welcome(this);
} else if (e.elif != null) {
ex.write(" else ");
e.elif.welcome(this);
}
return null;
}