Files
tp2-vsl-pds/src/main/java/TP2/asd/PrettyprinterVisitor.java
trochas 728014bb7a merge
2025-04-10 12:44:11 +02:00

188 lines
5.5 KiB
Java

package TP2.asd;
import TP2.asd.Interface.*;
import TP2.asd.Program.*;
public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
FunctionVisitor<String,String>,
DeclVisitor<String,String>,
InstrVisitor<String,String>,
ExprVisitor<String,String>,
TypeVisitor<String,String>
{
static String INDENT = " ";
//PROGRAM
@Override
public String visitProgram(ProgramImp prog, String indent) {
String str ="";
for(int i = 0; i<prog.fonctions().size(); i++){
str += prog.fonctions().get(i).accept(this,INDENT);
if(i<prog.fonctions().size()-1) str += "\n";
}
return str;
}
//FUNCTION
@Override
public String visitFunction(FunctionImp fun, String indent) {
String str = indent+"FUNC " + fun.type().accept(this,"")+ " " + fun.nom() +"() ";
str += fun.instruction().accept(this,indent)+"\n";
return str;
}
//DELCARATION
@Override
public String visitDeclaration(DeclarationImp instr, String indent) {
String str = indent +instr.t().accept(this,"") + " ";
for(int i = 0; i<instr.s().size();i++){
str += instr.s().get(i);
if(i<instr.s().size()-1) str += ",";
}
return str;
}
//INSTRUCTION
@Override
public String visitReturn(Return_instrImp instr, String indent) {
return indent+"RETURN " + instr.e().accept(this,"");
}
@Override
public String visitBloc(BlocImp instr, String indent) {
String str = "{\n";
for(int i = 0; i<instr.instrs().size(); i++){
str+=instr.instrs().get(i).accept(this, indent+INDENT)+"\n";
}
str += indent+"}";
return str;
}
@Override
public String visitBlocDec(BlocDecImp instr, String indent) {
String str = "{\n";
for(int i = 0; i<instr.decls().size(); i++){
str+=instr.decls().get(i).accept(this, indent+INDENT)+"\n";
}
for(int i = 0; i<instr.instrs().size(); i++){
str+=instr.instrs().get(i).accept(this, indent+INDENT)+"\n";
}
str += indent+"}";
return str;
}
@Override
public String visitAssign(AssignImp instr, String indent) {
return indent + instr.t()+ " := " + instr.e().accept(this,"");
}
@Override
public String visitPrint(PrintImp instr, String indent) {
String str = indent + "PRINT ";
for(int i = 0; i<instr.t().size(); i++){
Object o = instr.t().get(i);
if(o instanceof String){
str += "\"" + instr.t().get(i) +"\"";
}
else if(o instanceof Expression){
str += ((Expression)instr.t().get(i)).accept(this,"");
}
if(i<instr.t().size()-1) str += ", ";
}
return str;
}
@Override
public String visitIfThen(IfThenImp instr, String indent) {
String str = indent + "IF ";
str +=(instr.e().accept(this, ""));
str +=" THEN ";
for(int i=0; i<instr.i1().size();i++){
str+= instr.i1().get(i).accept(this, "");
}
return str;
}
@Override
public String visitIfThenElse(IfThenElseImp instr, String indent) {
String str = indent + "IF ";
str +=(instr.e().accept(this, ""));
str +=" THEN ";
for(int i=0; i<instr.i1().size();i++){
str+= instr.i1().get(i).accept(this, "");
}
str +=" ELSE ";
for(int i=0; i<instr.i2().size();i++){
str+= instr.i2().get(i).accept(this, "");
}
return str;
}
@Override
public String visitRead(ReadImp instr, String indent) {
String str = indent+"READ ";
for(int i = 0; i<instr.t().size(); i++){
str += instr.t().get(i).accept(this,indent);
if(i<instr.t().size()-1) str += ", ";
}
return str;
}
@Override
public String visitWhile(WhileImp instr, String indent) {
String str = indent+"WHILE ";
str += (instr.e().accept(this, ""));
str+= " DO ";
for(int i=0; i<instr.i1().size();i++){
str+= instr.i1().get(i).accept(this, "");
}
str+= " DONE";
return str;
}
//EXPRESSION
@Override
public String visitConst(ConstImp e, String indent) {
return e.c()+"";
}
@Override
public String visitBinOp(BinopExpressionImp e, String indent) {
String opStr = "?";
switch(e.op()){
case PLUS: opStr = "+"; break;
case DIV: opStr = "/"; break;
case MINUS: opStr = "-"; break;
case MOD: opStr = "%"; break;
case TIMES: opStr = "*"; break;
default:break;
}
return "(" + e.e1().accept(this,"") +" "+ opStr +" " + e.e2().accept(this,"") + ")";
}
//TYPE
@Override
public String visitInt(Type_intImp t, String h) {
return "INT";
}
@Override
public String visitVoid(Type_voidImp t, String h) {
return "VOID";
}
@Override
public String visitVar(VarImp e, String h) {
return e.name();
}
}