diff options
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r-- | src/Compiler/Translator.java | 61 |
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){ |