prática: um pretty printer para sol
DESCRIPTION
Departamento de Estatística e Informática Universidade Federal de Sergipe Compiladores. Prática: um pretty printer para SOL. Giovanny Lucero [email protected]. Program(ClassDecs, Statement) ClassDec EmptyClassDec() ClassDeclaration(Symbol name, - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/1.jpg)
1
Prática: um pretty printer para SOL
Giovanny Lucero
Departamento de Estatística e InformáticaUniversidade Federal de Sergipe
Compiladores
![Page 2: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/2.jpg)
2
Program(ClassDecs, Statement) ClassDec
EmptyClassDec()ClassDeclaration(Symbol name,
Symbol superclass, ClassInterf, ClassImp)
SequenceClassDec(ClassDec, ClassDec)
ClassInterf(VarDec, MethodHeader)
ClassImp(VarDec, MethodDec)
![Page 3: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/3.jpg)
3
VarDecEmptyVarDecs()VarDeclaration(Symbol, Type)
SequenceVarDec(VarDec, VarDec)
Em VarDeclaration não usamos IdList, pois é açucar sintático.
![Page 4: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/4.jpg)
4
MethodHeaderEmptyMehtodHeader()FunctionHeader(Symbol, VarDeclararionList,
Type)ProcedureHeader(Symbol,
VarDeclarationList)ConstructorHeader(VarDeclarationList)SequenceMethodHeader(MehtodHeader,
MethodHeader)
![Page 5: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/5.jpg)
5
MethodDecEmptyMethodDec()FunctionDec(Symbol, VarDeclararionList,
Type, Expression)ProcedureDec(Symbol, VarDeclarationList,
Statement)ConstructorDec(VarDeclarationList,
Statement)SequenceMethodDec(MethodDec,
MethodDec)
![Page 6: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/6.jpg)
6
TypePrimitive()
IdType(Symbol)ArrayP(Primitive, int)ArrayO(Symbol, int)
Primitivos: integer, character ou boolean
Por simplicidade podemos, alternativamente, representar tipos com Strings ou Symbols.
![Page 7: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/7.jpg)
7
StatementBlockStmt(varDecList, Statement)IfStmt(Expression, Statement, Statement) WhileStmt(Expression, Statement)PrintStmt(Expression)CallStmt(Expression target, Symbol name,
ExpressionList) AssignStmt(Variable, Expression)SkipStmt()SequenceStmt(Statement, Statement)
else condicional é açucar sintáticof(x) é um açucar sintático de this.f(x)
![Page 8: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/8.jpg)
8
ExpressionBlockExp(VarDec, Statement, Expression)BinaryBoolExp(int operand, Expression,
Expression)BinaryArithmeticExp(int operand, Expression,
Expression)BinaryComparissonExp(int operand,
Expression, Expression)
UnaryOperationExp(int operand, Expression, Expression) ...
![Page 9: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/9.jpg)
9
CallExp(Expression target, Symbol name, ExpressionList)
VarExp(Variable)NewObjectExp(Symbol, ExpressionList)NewArrayExp(Type, Expression)IntLiteralExp(int)CharLiteralExp(char)BoolLiteralExp(bool)selfExp()nullExp()
![Page 10: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/10.jpg)
10
VariableIdVar(Symbol)FieldVar(Expression target, Symbol field)ArrayElementVar(Expression target,
Expression index)
![Page 11: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/11.jpg)
11
SolVisitor
interface SolVisitor {visitProgram(Program p);visitEmptyClassDec(EmptyClassDec dec);visitClassDeclaration(ClassDeclaration dec);visitSequenceClassDec(SequenceClassDec dec);
....
visitAssignStmt(AssignStmt stm);
}
![Page 12: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/12.jpg)
12
class ClassDeclarationextends ClassDec { ....
void accept(SolVisitor visitor) {visitor.visitClassDeclaration(this) }
class AssingStmtextends Statement { ....
void accept(SolVisitor visitor) {visitor.visitAssingStmt(this);
}}
Sintaxe Abstrata com visitors
![Page 13: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/13.jpg)
13
class AssignStmt extends Statement { Variable var; Expression exp; AssignStm(Variable var, Expression exp) {
this.var = var;this.exp = exp;
void accept(SolVisitor visitor) {visitor.visitAssingStmt(this);
}}
![Page 14: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/14.jpg)
14
abstract class ClassDec { void abstract accept(SolVisitor visitor);
}
![Page 15: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/15.jpg)
15
Um Pretty Printer
public class PrettySol implementes SolVisitor {private int indent = 0;private static int indInc = 3;
private void indent() { indent += indInc; }
private void unindent() { unindent -= indInc; }
private void write(String st) { System.out.print(st); }
private void writeln(String st) { System.out.println(st); char [] ws = Arrays.fill(new char[indent], ' ');System.out.print(new String(ws));}
![Page 16: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/16.jpg)
16
void visitProgram(Program p) {p.classDec.accept(this);writeln(“main”);indent();p.main.accept(this);
}
![Page 17: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/17.jpg)
17
void visitBinaryArithmeticExp (BinaryArithmeticExp exp) { write (“( ”);
exp.left.accept(this);switch (exp.operator) { case '+': write(“ + ”); break;
case '*': write (“ * ”); break; ... }
exp.right.accept(this);write(“)”);
}
![Page 18: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/18.jpg)
18
void visitAssignStm(AssignStm stm) {stm.var.accept(this);write(" := ");stm.exp.accept(this);write(";")
}
void visitSequenceStmt(SequenceStmt stm) {stm.stm1.accept(this);writeln("");stm.stm2.accept(this);
}
![Page 19: Prática: um pretty printer para SOL](https://reader036.vdocuments.us/reader036/viewer/2022082818/56813271550346895d990ae6/html5/thumbnails/19.jpg)
19
void visitIfStm(IfStm stm) {write("if “);stm.exp.accept(this);writeln(“ then ”);indent();stm.stm1.accept(this);unindent();writeln("");writeln("else ");indent();stm.stm2.accept(this);unindent();
}