summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Translator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r--src/Compiler/Translator.java57
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){