diff options
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r-- | src/Compiler/Translator.java | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java index c40c6b5..a79242d 100644 --- a/src/Compiler/Translator.java +++ b/src/Compiler/Translator.java @@ -46,6 +46,9 @@ public class Translator{ case "stringDec": evalStringDeclaration((StringDeclaration)statement); break; + case "arrayDec": + evalArrayDeclaration((ArrayDeclaration)statement); + break; case "block": evalBlockStatement((BlockStatement)statement); break; @@ -83,6 +86,26 @@ public class Translator{ } } + private void evalArrayDeclaration(ArrayDeclaration arraydec){ + environment.defineVariable(arraydec.name.text, arraydec.type); + String arrayString = ""; + if(arraydec.type.equals("int")){ + arrayString+="int "; + } else if(arraydec.type.equals("real")){ + arrayString+="real "; + } + arrayString+=arraydec.name.text; + for(Expression expr:arraydec.dimensions){ + arrayString+="["; + arrayString+=evaluateExpression(expr); + arrayString+="]"; + } + arrayString+=";"; + CCode.add(arrayString); + + + } + private void evalBlockStatement(BlockStatement block){ for(Statement stmt:block.statements){ evaluateStatement(stmt); @@ -106,6 +129,9 @@ public class Translator{ else if (expr instanceof Expression.Variable){ exprType=(String)environment.getVariable((((Expression.Variable)expr).name)); } + else if (expr instanceof Expression.ArrayVariable){ + exprType=(String)environment.getVariable((((Expression.ArrayVariable)expr).name)); + } if (exprType.equals("int")){ types+="%d"; } else if (exprType.equals("double")){ @@ -162,6 +188,8 @@ public class Translator{ case "assign": evaluateAssignmentExpression((AssignmentExpression)expression); return ""; + case "arrayvar": + return evaluateArrayVariable((ArrayVariable)expression); case "var": return evaluateVariableExpression((Variable)expression); default: @@ -220,18 +248,39 @@ public class Translator{ } private void evaluateAssignmentExpression(AssignmentExpression expr){ - if(environment.checkVariable(expr.name)){ + Token name=null; + if(expr.variable instanceof Expression.Variable){ + name = ((Expression.Variable)expr.variable).name; + } + else if(expr.variable instanceof Expression.ArrayVariable){ + name = ((Expression.ArrayVariable)expr.variable).name; + } + if(environment.checkVariable(name)){ if(expr.value instanceof Expression.Literal){ if(((Expression.Literal)expr.value).type.equals("string")){ - CCode.add("strcpy("+expr.name.text+","+evaluateExpression(expr.value)+");"); + CCode.add("strcpy("+evaluateExpression(expr.variable)+","+evaluateExpression(expr.value)+");"); }else{ - CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";"); + CCode.add(evaluateExpression(expr.variable)+"="+evaluateExpression(expr.value)+";"); } } else{ - CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";"); + CCode.add(evaluateExpression(expr.variable)+"="+evaluateExpression(expr.value)+";"); + } + } + } + + private String evaluateArrayVariable(ArrayVariable expr){ + if(environment.checkVariable(expr.name)){ + String arrayString=""; + arrayString+=expr.name.text; + for(Expression position:expr.positions){ + arrayString+="["; + arrayString+=evaluateExpression(position); + arrayString+="]"; } + return arrayString; } + return null; } private String evaluateVariableExpression(Variable expr){ |