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.java61
1 files changed, 45 insertions, 16 deletions
diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java
index 716bafd..d343b80 100644
--- a/src/Compiler/Translator.java
+++ b/src/Compiler/Translator.java
@@ -15,6 +15,7 @@ public class Translator{
public List<String> compileToC(List<Statement> statements){
CCode.add("#include <stdio.h>");
+ CCode.add("#include <string.h>");
CCode.add("int main(){");
try{
for (Statement statement: statements){
@@ -37,9 +38,12 @@ public class Translator{
case "exprStmt":
evalExpressionStatement((ExpressionStatement)statement);
break;
- case "vardec":
+ case "varDec":
evalVariableDeclaration((VariableDeclaration)statement);
break;
+ case "stringDec":
+ evalStringDeclaration((StringDeclaration)statement);
+ break;
case "print":
evalPrintStatement((PrintStatement)statement);
break;
@@ -52,31 +56,49 @@ public class Translator{
evaluateExpression(stmt.expr);
}
+ private void evalStringDeclaration(StringDeclaration stringdec){
+ environment.defineVariable(stringdec.name.text, "string");
+ int size = (int)((Expression.Literal)stringdec.length).value.value;
+ size++;
+ CCode.add("char "+stringdec.name.text+"["+size+"];");
+ }
+
private void evalVariableDeclaration(VariableDeclaration vardec){
environment.defineVariable(vardec.name.text, vardec.type);
if(vardec.type.equals("int")){
CCode.add("int "+vardec.name.text+";");
} else if(vardec.type.equals("real")){
CCode.add("float "+vardec.name.text+";");
- }
+ }
}
private void evalPrintStatement(PrintStatement print){
- if(print.expr instanceof Expression.Literal){
- if (((Expression.Literal)print.expr).type.equals("int")){
- CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");");
- } else if (((Expression.Literal)print.expr).type.equals("double")){
- CCode.add("printf(\"%f\","+evaluateExpression(print.expr)+");");
+ String types="";
+ String values="";
+ boolean first=true;
+ for(Expression expr:print.exprList){
+ if(!first){
+ values+=",";
+ }else{
+ first=false;
+ }
+ String exprType="";
+ if(expr instanceof Expression.Literal){
+ exprType=((Expression.Literal)expr).type;
+ }
+ else if (expr instanceof Expression.Variable){
+ exprType=(String)environment.getVariable((((Expression.Variable)expr).name).text);
}
- } else if (print.expr instanceof Expression.Variable){
- Object varValue = environment.getVariable((((Expression.Variable)print.expr).name).text);
- if (varValue.equals("int")){
- CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");");
- } else if (varValue.equals("real")){
- CCode.add("printf(\"%f\","+evaluateExpression(print.expr)+");");
- }
+ if (exprType.equals("int")){
+ types+="%d";
+ } else if (exprType.equals("double")){
+ types+="%f";
+ } else if (exprType.equals("string")){
+ types+="%s";
+ }
+ values+=evaluateExpression(expr);
}
-
+ CCode.add("printf(\""+types+"\","+values+");");
}
private void evalIfStatement(IfStatement ifstatement){
@@ -145,7 +167,14 @@ public class Translator{
}
private void evaluateAssignmentExpression(AssignmentExpression expr){
- CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";");
+ if(expr.value instanceof Expression.Literal){
+ if(((Expression.Literal)expr.value).type.equals("string")){
+ CCode.add("strcpy("+expr.name.text+","+evaluateExpression(expr.value)+");");
+ }
+ }
+ else{
+ CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";");
+ }
}
private String evaluateVariableExpression(Variable expr){