mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-28 16:28:04 +00:00
Implemented typedblock (some statements and expressions) and add some TODOs
This commit is contained in:
parent
f502e58e6e
commit
ba7b23bd34
@ -15,115 +15,114 @@ public class TypedBlock implements TypedNode {
|
||||
private List<TypedStatement> stmts;
|
||||
|
||||
|
||||
public TypedBlock blockToTypedBlock(Map<String, Type> localVar, Map<String, TypedClass> classes, Block unTypedBlock) {
|
||||
|
||||
public TypedBlock unTypedBlockToTypedBlock(Block unTypedBlock) {
|
||||
|
||||
if (unTypedBlock == null) {
|
||||
return null;
|
||||
}
|
||||
TypedBlock typedBlock = new TypedBlock();
|
||||
typedBlock.setStmts(new ArrayList<>());
|
||||
typedBlock.setVars(new ArrayList<>());
|
||||
|
||||
if(unTypedBlock.localVariables().isEmpty()){
|
||||
|
||||
if (unTypedBlock.localVariables().isEmpty()) {
|
||||
typedBlock.setVars(List.of());
|
||||
} else {
|
||||
for (Declaration var : unTypedBlock.localVariables()) {
|
||||
TypedLocalVariable typedVar = new TypedLocalVariable()
|
||||
.convertToTypedLocalVariable(localVar, classes, var);
|
||||
typedBlock.getVars().add(typedVar);
|
||||
}
|
||||
}
|
||||
|
||||
if(unTypedBlock.stmts().isEmpty()){
|
||||
if (unTypedBlock.stmts().isEmpty()) {
|
||||
typedBlock.setStmts(List.of());
|
||||
} else {
|
||||
|
||||
for (var stmt : unTypedBlock.stmts()) {
|
||||
if (stmt instanceof Assignment assignment) {
|
||||
TypedAssignment typedAssignment = new TypedAssignment()
|
||||
.convertToTypedAssignment(localVar, classes, assignment);
|
||||
typedAssignment.typeCheck(localVar, classes);
|
||||
typedBlock.getStmts().add(typedAssignment);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof For forStmt) {
|
||||
TypedFor typedFor = new TypedFor()
|
||||
.convertToTypedFor(localVar, classes, forStmt);
|
||||
typedFor.typeCheck(localVar, classes);
|
||||
typedBlock.getStmts().add(typedFor);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof IfElse ifElse) {
|
||||
TypedIfElse typedIfElse = new TypedIfElse()
|
||||
.convertToTypedIfElse(localVar, classes, ifElse);
|
||||
typedIfElse.typeCheck(localVar, classes);
|
||||
typedBlock.getStmts().add(typedIfElse);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof While whileStmt) {
|
||||
TypedWhile typedWhile = new TypedWhile()
|
||||
.convertToTypedWhile(localVar, classes, whileStmt);
|
||||
//TODO: check the type
|
||||
typedBlock.getStmts().add(typedWhile);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof DoWhile doWhile) {
|
||||
TypedDoWhile typedDoWhile = new TypedDoWhile()
|
||||
.convertToTypedDoWhile(localVar, classes, doWhile);
|
||||
//TODO: check the type
|
||||
typedBlock.getStmts().add(typedDoWhile);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof Return returnStmt) {
|
||||
TypedReturn typedReturn = new TypedReturn()
|
||||
.convertToTypedReturn(localVar, classes, returnStmt);
|
||||
//TODO: check the type
|
||||
typedBlock.getStmts().add(typedReturn);
|
||||
continue;
|
||||
}
|
||||
if (stmt instanceof New newStmt) {
|
||||
TypedNew typedNew = new TypedNew();
|
||||
//TODO: implement this
|
||||
continue;
|
||||
}
|
||||
|
||||
if (stmt instanceof Break) {
|
||||
TypedBreak typedBreak = new TypedBreak();
|
||||
typedBreak.typeCheck(localVar, classes);
|
||||
typedBlock.getStmts().add(typedBreak);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (stmt instanceof MethodCall methodCall) {
|
||||
TypedMethodCall typedMethodCall = new TypedMethodCall();
|
||||
//TODO: implement this
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Declaration var : unTypedBlock.localVariables()) {
|
||||
TypedLocalVariable typedVar = new TypedLocalVariable();
|
||||
typedVar.setName(var.name());
|
||||
typedVar.setType(var.type());
|
||||
typedBlock.getVars().add(typedVar);
|
||||
}
|
||||
|
||||
for(var stmt : unTypedBlock.stmts()){
|
||||
|
||||
if(stmt instanceof Assignment assignment){
|
||||
TypedAssignment typedAssignment = new TypedAssignment();
|
||||
typedAssignment.setVarName(assignment.location().id());
|
||||
typedAssignment.setValue(null);
|
||||
typedBlock.getStmts().add(typedAssignment);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof For forStmt){
|
||||
TypedFor typedFor = new TypedFor();
|
||||
TypedBlock typedBlock1 = new TypedBlock();
|
||||
typedFor.setTypedBlock(typedBlock1.unTypedBlockToTypedBlock((forStmt.block())));
|
||||
typedFor.setAssign(null);
|
||||
typedFor.setCond(null);
|
||||
typedFor.setInc(null);
|
||||
typedBlock.getStmts().add(typedFor);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof IfElse ifElse){
|
||||
TypedIfElse typedIfElse = new TypedIfElse();
|
||||
TypedBlock typedBlockIf = new TypedBlock();
|
||||
TypedBlock typedBlockElse = new TypedBlock();
|
||||
typedIfElse.setIfTypedBlock(typedBlockIf.unTypedBlockToTypedBlock(ifElse.ifBlock()));
|
||||
typedIfElse.setElseTypedBlock(typedBlockElse.unTypedBlockToTypedBlock(ifElse.elseBlock()));
|
||||
typedIfElse.setTypedCon(null);
|
||||
typedBlock.getStmts().add(typedIfElse);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof MethodCall methodCall){
|
||||
TypedMethodCall typedMethodCall = new TypedMethodCall();
|
||||
typedMethodCall.setArgs(null);
|
||||
typedMethodCall.setRecipient(null);
|
||||
typedBlock.getStmts().add(typedMethodCall);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof New newStmt){
|
||||
TypedNew typedNew = new TypedNew();
|
||||
typedNew.setArgs(null);
|
||||
typedNew.setType(newStmt.type());
|
||||
typedBlock.getStmts().add(typedNew);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof Return returnStmt){
|
||||
TypedReturn typedReturn = new TypedReturn();
|
||||
typedReturn.setRet(null);
|
||||
typedBlock.getStmts().add(typedReturn);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof While whileStmt){
|
||||
TypedWhile typedWhile = new TypedWhile();
|
||||
TypedBlock typedBlock1 = new TypedBlock();
|
||||
typedWhile.setTypedBlock(typedBlock1.unTypedBlockToTypedBlock(whileStmt.block()));
|
||||
typedWhile.setCond(null);
|
||||
typedBlock.getStmts().add(typedWhile);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof DoWhile doWhile){
|
||||
TypedDoWhile typedDoWhile = new TypedDoWhile();
|
||||
TypedBlock typedBlock1 = new TypedBlock();
|
||||
typedDoWhile.setTypedBlock(typedBlock1.unTypedBlockToTypedBlock(doWhile.block()));
|
||||
typedDoWhile.setCond(null);
|
||||
typedBlock.getStmts().add(typedDoWhile);
|
||||
continue;
|
||||
}
|
||||
if(stmt instanceof Break){
|
||||
TypedBreak typedBreak = new TypedBreak();
|
||||
typedBlock.getStmts().add(typedBreak);
|
||||
}
|
||||
|
||||
}
|
||||
//System.out.println("stmts:" + typedBlock.getStmts().toString());
|
||||
|
||||
return typedBlock;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type typeCheck(Map<String, Type> localVar, Map<String, TypedClass> classes) {
|
||||
Type typeOfLastStmt = Type.VOID;
|
||||
for (TypedLocalVariable var : vars) {
|
||||
var.typeCheck(localVar, classes);
|
||||
if (vars == null) {
|
||||
vars = List.of();
|
||||
} else {
|
||||
for (TypedLocalVariable var : vars) {
|
||||
var.typeCheck(localVar, classes);
|
||||
}
|
||||
}
|
||||
for (TypedStatement stmt : stmts) {
|
||||
stmt.typeCheck(localVar, classes);
|
||||
typeOfLastStmt = stmt.typeCheck(localVar, classes);
|
||||
if (stmts == null) {
|
||||
stmts = List.of();
|
||||
} else {
|
||||
for (TypedStatement stmt : stmts) {
|
||||
stmt.typeCheck(localVar, classes);
|
||||
}
|
||||
}
|
||||
|
||||
return typeOfLastStmt;
|
||||
return Type.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -141,8 +140,8 @@ public class TypedBlock implements TypedNode {
|
||||
}
|
||||
typedBlock.getStmts().add((TypedStatement) untyped.stmts());
|
||||
int i = 0;
|
||||
for(var stmt : untyped.stmts()){
|
||||
System.out.println(i++ +" :" + stmt);
|
||||
for (var stmt : untyped.stmts()) {
|
||||
System.out.println(i++ + " :" + stmt);
|
||||
}
|
||||
|
||||
return typedBlock;
|
||||
|
Loading…
Reference in New Issue
Block a user