Fehlendes Return am Ende von Blocks beim Parsen einfügen
This commit is contained in:
parent
4ecf526b14
commit
de91e49bcc
@ -129,7 +129,7 @@ public class StatementGenerator {
|
|||||||
if(stmt.block() != null){
|
if(stmt.block() != null){
|
||||||
return convert(stmt.block());
|
return convert(stmt.block());
|
||||||
}else if(stmt.emptyStatement() != null){
|
}else if(stmt.emptyStatement() != null){
|
||||||
return new EmptyStmt();
|
return new EmptyStmt(stmt.getStart());
|
||||||
}else if(stmt.expressionStatement() != null){
|
}else if(stmt.expressionStatement() != null){
|
||||||
return convert(stmt.expressionStatement());
|
return convert(stmt.expressionStatement());
|
||||||
}else if(stmt.assertStatement() != null){
|
}else if(stmt.assertStatement() != null){
|
||||||
@ -160,7 +160,7 @@ public class StatementGenerator {
|
|||||||
Statement stmt = convert(statementContext);
|
Statement stmt = convert(statementContext);
|
||||||
statements.add(stmt);
|
statements.add(stmt);
|
||||||
}
|
}
|
||||||
|
statements = SyntacticSugar.addTrailingReturn(statements);
|
||||||
return new Block(statements, block.getStart());
|
return new Block(statements, block.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,16 +1,34 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Statement;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SyntacticSugar {
|
public class SyntacticSugar {
|
||||||
public List<Statement> addTrailingReturn(List<Statement> statements){
|
|
||||||
Statement lastStmt = statements.get(statements.size()-1);
|
public static List<Statement> addTrailingReturn(List<Statement> statements){
|
||||||
if(lastStmt instanceof Return)return statements;
|
if(statements.size()!=0) {
|
||||||
|
Statement lastStmt = statements.get(statements.size() - 1);
|
||||||
|
if (lastStmt instanceof Return) return statements;
|
||||||
|
if (lastStmt instanceof WhileStmt) {
|
||||||
|
if (hasReturn(((WhileStmt) lastStmt).loop_block)) return statements;
|
||||||
|
} else if (lastStmt instanceof IfStmt) {
|
||||||
|
if (hasReturn(((IfStmt) lastStmt).then_block)
|
||||||
|
&& hasReturn(((IfStmt) lastStmt).else_block)) return statements;
|
||||||
|
} else if (lastStmt instanceof ForStmt) {
|
||||||
|
if (hasReturn(((ForStmt) lastStmt).body_Loop_block)) return statements;
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statements.add(new ReturnVoid(new NullToken()));
|
||||||
return statements;
|
return statements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean hasReturn(Block block){
|
||||||
|
for(Statement s : block.getStatements())
|
||||||
|
if(s instanceof Return)return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,17 @@
|
|||||||
package de.dhbwstuttgart.syntaxtree.statement;
|
package de.dhbwstuttgart.syntaxtree.statement;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.Void;
|
||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceInformation;
|
||||||
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
|
||||||
public class EmptyStmt extends Statement
|
public class EmptyStmt extends Statement
|
||||||
{
|
{
|
||||||
public EmptyStmt()
|
public EmptyStmt(Token offset)
|
||||||
{
|
{
|
||||||
super(null,null);
|
super(new Void(offset),offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ public class ForStmt extends Statement
|
|||||||
private Expression head_Initializer;
|
private Expression head_Initializer;
|
||||||
private Expression head_Condition;
|
private Expression head_Condition;
|
||||||
private Expression head_Loop_expr;
|
private Expression head_Loop_expr;
|
||||||
private Statement body_Loop_block;
|
public Block body_Loop_block;
|
||||||
|
|
||||||
public ForStmt(int offset, int variableLength)
|
public ForStmt(int offset, int variableLength)
|
||||||
{
|
{
|
||||||
|
@ -14,8 +14,8 @@ public class IfStmt extends Statement
|
|||||||
|
|
||||||
public boolean hamaDebug = true; //hama: Debug Ausgaben von mir ein- bzw. ausschalten
|
public boolean hamaDebug = true; //hama: Debug Ausgaben von mir ein- bzw. ausschalten
|
||||||
public Expression expr;
|
public Expression expr;
|
||||||
public Statement then_block;
|
public Block then_block;
|
||||||
public Statement else_block;
|
public Block else_block;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConstraintSet getConstraints(TypeInferenceBlockInformation info) {
|
public ConstraintSet getConstraints(TypeInferenceBlockInformation info) {
|
||||||
|
@ -17,7 +17,6 @@ public class Return extends Statement
|
|||||||
this.retexpr = retExpr;
|
this.retexpr = retExpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConstraintSet getConstraints(TypeInferenceBlockInformation info) {
|
public ConstraintSet getConstraints(TypeInferenceBlockInformation info) {
|
||||||
ConstraintSet ret = retexpr.getConstraints(info);
|
ConstraintSet ret = retexpr.getConstraints(info);
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package de.dhbwstuttgart.syntaxtree.statement;
|
||||||
|
|
||||||
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
|
public class ReturnVoid extends Return{
|
||||||
|
public ReturnVoid(Token offset) {
|
||||||
|
super(new EmptyStmt(offset), offset);
|
||||||
|
}
|
||||||
|
}
|
@ -14,7 +14,7 @@ public class WhileStmt extends Statement
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Expression expr;
|
public Expression expr;
|
||||||
public Statement loop_block;
|
public Block loop_block;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <br/>Author: Martin Pl�micke
|
* <br/>Author: Martin Pl�micke
|
||||||
|
Loading…
Reference in New Issue
Block a user