Prática: um pretty printer para SOL

19
1 Prática: um pretty printer para SOL Giovanny Lucero [email protected] Departamento de Estatística e Informátic Universidade Federal de Sergipe Compiladores

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 Presentation

Transcript of Prática: um pretty printer para SOL

Page 1: Prática: um pretty printer para SOL

1

Prática: um pretty printer para SOL

Giovanny Lucero

[email protected]

Departamento de Estatística e InformáticaUniversidade Federal de Sergipe

Compiladores

Page 2: Prática: um pretty printer para SOL

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

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

4

MethodHeaderEmptyMehtodHeader()FunctionHeader(Symbol, VarDeclararionList,

Type)ProcedureHeader(Symbol,

VarDeclarationList)ConstructorHeader(VarDeclarationList)SequenceMethodHeader(MehtodHeader,

MethodHeader)

Page 5: Prática: um pretty printer para SOL

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

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

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

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

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

10

VariableIdVar(Symbol)FieldVar(Expression target, Symbol field)ArrayElementVar(Expression target,

Expression index)

Page 11: Prática: um pretty printer para SOL

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

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

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

14

abstract class ClassDec { void abstract accept(SolVisitor visitor);

}

Page 15: Prática: um pretty printer para SOL

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

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

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

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

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();

}