Como construir um compilador utilizando ferramentas Java

Documentos relacionados
Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Familiarização com a ferramenta JavaCC

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java

Análise Sintática. Fabiano Baldo

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Conceitos de Linguagens de Programação

Como construir um compilador utilizando ferramentas Java

Tratamento de Exceções

Notas de Aula 09: Tratamento de exceções

Compiladores 02 Analise léxica

Programação Orientada a Objetos SANTOS, Rafael (PLT)

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Compiladores Aula 1. Celso Olivete Júnior.

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Tipos de dados e comandos POO

Trabalhos de Laboratório de Interpretação e Compilação de Linguagens de Programação

Compiladores Análise Semântica

Compiladores - Análise Léxica

Compiladores - JACC. Fabio Mascarenhas

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 28 de setembro de 12

Compiladores Análise Semântica

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Linguagem de Programação II Implementação

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

Compiladores - Análise LL(1)

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Compiladores - JFlex. Fabio Mascarenhas

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

Compiladores - Análise SLR

Compiladores - Autômatos

Palavras Reservadas da Linguagem Java

4 Conceito de Herança

Compiladores 04 Analise léxica Jflex. Prof José Rui

Interfaces POO. Prof. Marcio Delamaro

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Compiladores Aula 3. Celso Olivete Júnior.

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Construção de Compiladores Aula 3 - Analisador Sintático

Compiladores - Análise Preditiva

Programação Estruturada e Orientada a Objetos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Compiladores. Introdução

Análise Sintática Introdução

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Análise de Programação

Construção de Compiladores Aula 16 - Análise Sintática

Design Patterns (Factory Method, Prototype, Singleton)

Tratamento de Exceções cont. Profa. Thienne Johnson EACH/USP

Notação EBNF BNF estendida Notação usada com o YACC (gerador de parsers Bottom-up)

Compiladores - Análise Léxica

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Transcrição:

Como construir um compilador utilizando ferramentas Java p. 1/4 Como construir um compilador utilizando ferramentas Java Aula 9 Construção da árvore sintática Prof. Márcio Delamaro delamaro@icmc.usp.br

Como construir um compilador utilizando ferramentas Java p. 2/4 O que temos até agora JavaCC javac prog.x kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk langx Analisador Sintático Erros sintáticos Não erros

Como construir um compilador utilizando ferramentas Java p. 3/4 O que queremos JavaCC javac prog.x kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk kfdfdjkfdsjkfdsjkfdkfdsjk langx Analisador Sintático Erros sintáticos Não erros

Como construir um compilador utilizando ferramentas Java p. 4/4 O que é árvore sintática Dada a GLC, uma árvore sintática é uma árvore rotulada cuja raiz tem sempre o não-terminal inicial como rótulo. Numa derivação S α 1 α 2...α n o nó S tem como filhos n nós rotulados α 1 até α n.

Como construir um compilador utilizando ferramentas Java p. 5/4 Exemplo class test class test2 program classlist EOF classdecl classlist class test classbody classdecl class test2 classbody

Como construir um compilador utilizando ferramentas Java p. 6/4 Árvore sintática abstrata program classlist classdecl classlist test classbody classdecl λ test2 classbody λ

Como construir um compilador utilizando ferramentas Java p. 7/4 Construção da árvore À medida que um não terminal é reconhecido, um nó da árvore é criado De baixo para cima Cada execução de um dos métodos associados aos não-terminais cria um nó da árvore e pendura nele os nós filhos.

Como construir um compilador utilizando ferramentas Java p. 8/4 Construção da árvore Tokens reconhecidos naquele método e pelos outros nós criados pelas chamadas a outro métodos de não-terminais. Cada nó da árvore é representado por um objeto Java que possui referências a outro objetos, que são seus filhos. Nós diferentes são representados por objetos de diferentes classes.

Como construir um compilador utilizando ferramentas Java p. 9/4 Hierarquia de classes Todas as classes que representam os nós têm uma superclasse em comum

Como construir um compilador utilizando ferramentas Java p. 9/4 Hierarquia de classes Todas as classes que representam os nós têm uma superclasse em comum GeneralNode ClassDeclNode ListNode

Como construir um compilador utilizando ferramentas Java p. 10/4 GeneralNode package syntactictree; import Token; abstract public class GeneralNode public Token position; public GeneralNode(Token x) position = x;

Como construir um compilador utilizando ferramentas Java p. 11/4 Modificações no.jj cada método correspondente aos não-terminais pode retornar um valor. Cada um desses métodos retorna o nó que construiu, permitindo que o método que fez a chamada possa utilizar esse nó;

Como construir um compilador utilizando ferramentas Java p. 11/4 Modificações no.jj cada método correspondente aos não-terminais pode retornar um valor. Cada um desses métodos retorna o nó que construiu, permitindo que o método que fez a chamada possa utilizar esse nó; cada token consumido pelo AS pode ser utilizado pelos métodos dos não-terminais para construir o nó da árvore. Para isso, basta atribuir o token que aparece na definição BNF para uma variável e, depois, utilizá-la na construção do nó;

Como construir um compilador utilizando ferramentas Java p. 11/4 Modificações no.jj cada método correspondente aos não-terminais pode retornar um valor. Cada um desses métodos retorna o nó que construiu, permitindo que o método que fez a chamada possa utilizar esse nó; cada token consumido pelo AS pode ser utilizado pelos métodos dos não-terminais para construir o nó da árvore. Para isso, basta atribuir o token que aparece na definição BNF para uma variável e, depois, utilizá-la na construção do nó; a cada token e a cada chamada de um método de um não-terminal que aparecem nas definições BNF é possível associar código Java que é executado.

Como construir um compilador utilizando ferramentas Java p. 12/4 classdecl retorno ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : try <CLASS> <IDENT> [ <EXTENDS> <IDENT> ] classbody(g) catch (ParseException e) consumeuntil(g, e, "classdecl");

Como construir um compilador utilizando ferramentas Java p. 13/4 classdecl tokens ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null; try t1 = <CLASS> <IDENT> [ <EXTENDS> <IDENT> ] classbody(g) catch (ParseException e) consumeuntil(g, e, "classdecl");

Como construir um compilador utilizando ferramentas Java p. 14/4 classdecl tokens ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null, t2 = null, t3 = null; try t1 = <CLASS> t2 = <IDENT> [ <EXTENDS> t3 = <IDENT> ] classbody(g) catch (ParseException e) consumeuntil(g, e, "classdecl");

Como construir um compilador utilizando ferramentas Java p. 15/4 classdecl nós filhos ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null, t2 = null, t3 = null; ClassBodyNode c1 = null; try t1 = <CLASS> t2 = <IDENT> [ <EXTENDS> t3 = <IDENT> ] c1 = classbody(g) catch (ParseException e) consumeuntil(g, e, "classdecl");

Como construir um compilador utilizando ferramentas Java p. 16/4 classdecl retorno ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null, t2 = null, t3 = null; ClassBodyNode c1 = null; try t1 = <CLASS> t2 = <IDENT> [ <EXTENDS> t3 = <IDENT> ] c1 = classbody(g) return new ClassDeclNode(t1, t2, t3, c1); catch (ParseException e) consumeuntil(g, e, "classdecl");

Como construir um compilador utilizando ferramentas Java p. 17/4 classdecl erro sintático ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null, t2 = null, t3 = null; ClassBodyNode c1 = null; try t1 = <CLASS> t2 = <IDENT> [ <EXTENDS> t3 = <IDENT> ] c1 = classbody(g) return new ClassDeclNode(t1, t2, t3, c1); catch (ParseException e) consumeuntil(g, e, "classdecl"); return new ClassDeclNode(t1, t2, t3, c1);

Como construir um compilador utilizando ferramentas Java p. 18/4 classdecl ClassDeclNode classdecl(recoveryset g) throws ParseEOFException : Token t1 = null, t2 = null, t3 = null; ClassBodyNode c1 = null; try t1 = <CLASS> t2 = <IDENT> [ <EXTENDS> t3 = <IDENT> ] c1 = classbody(g) return new ClassDeclNode(t1, t2, t3, c1); catch (ParseException e) consumeuntil(g, e, "classdecl"); return new ClassDeclNode(t1, t2, t3, c1);

Como construir um compilador utilizando ferramentas Java p. 19/4 ClassDeclNode package syntactictree; import Token; public class ClassDeclNode extends GeneralNode public Token name; public Token supername; public ClassBodyNode body; public ClassDeclNode(Token t1, Token t2, Token t3, ClassBodyNode c) //passa token de referência para construtor da superclasse super(t1); name = t2; supername = t3; body = c;

Como construir um compilador utilizando ferramentas Java p. 20/4 ClassDeclNode package syntactictree; import Token; public class ClassDeclNode extends GeneralNode public Token name; public Token supername; public ClassBodyNode body; public ClassDeclNode(Token t1, Token t2, Token t3, ClassBodyNode c) //passa token de referência para construtor da superclasse super(t1); name = t2; supername = t3; body = c;

Como construir um compilador utilizando ferramentas Java p. 21/4 ClassDeclNode package syntactictree; import Token; public class ClassDeclNode extends GeneralNode public Token name; public Token supername; public ClassBodyNode body; public ClassDeclNode(Token t1, Token t2, Token t3, ClassBodyNode c) //passa token de referência para construtor da superclasse super(t1); name = t2; supername = t3; body = c;

Como construir um compilador utilizando ferramentas Java p. 22/4 classdecl exemplo class a extends b... ClassDeclNode Token: a Token: b ClassBodyNode

Como construir um compilador utilizando ferramentas Java p. 23/4 Nó inicial ListNode program() throws ParseEOFException : RecoverySet g = First.program; ListNode l = null, d = null; <EOF> ( l = classlist(g) try <EOF> return l; catch (ParseException e) consumeuntil(g, e, "program"); [ d = program() ] ) return l;

Como construir um compilador utilizando ferramentas Java p. 24/4 ListNode ListNode GeneralNode ListNode GeneralNode ListNode GeneralNode

Como construir um compilador utilizando ferramentas Java p. 25/4 ListNode class a extends b... class b... class c... ListNode ClassDeclNode ListNode ClassDeclNode ListNode ClassDeclNode

Como construir um compilador utilizando ferramentas Java p. 26/4 classlist ListNode classlist(recoveryset g) throws ParseEOFException : ClassDeclNode c = null; ListNode l = null; RecoverySet f = First.classlist.union(g); ( c = classdecl(f) [ l = classlist(g) ] ) return new ListNode(c, l);

Como construir um compilador utilizando ferramentas Java p. 27/4 classbody ClassBodyNode classbody(recoveryset g) throws ParseEOFException : ListNode c = null, v = null, ct = null, m = null; VarDeclNode vd; ConstructDeclNode cd; MethodDeclNode md; Token t = null;

Como construir um compilador utilizando ferramentas Java p. 28/4 classbody try t = <LBRACE> [c = classlist(f5)] (LOOKAHEAD(3) vd = vardecl(f2) <SEMICOLON> if ( v == null) v = new ListNode(vd); else v.add(vd); )*

Como construir um compilador utilizando ferramentas Java p. 29/4 classbody (cd = constructdecl(f4) if ( ct == null) ct = new ListNode(cd); else ct.add(cd); )*

Como construir um compilador utilizando ferramentas Java p. 30/4 classbody (md = methoddecl(f3) if ( m == null) m = new ListNode(md); else m.add(md); )*

Como construir um compilador utilizando ferramentas Java p. 31/4 classbody <RBRACE> return new ClassBodyNode(t, c, v, ct, m); catch (ParseException e) consumeuntil(g, e, "classbody"); return new ClassBodyNode(t, c, v, ct, m);

Como construir um compilador utilizando ferramentas Java p. 32/4 classbody exemplo class teste class a... class b... int c, d; string e, f; constructor (int g)... int h()...

Como construir um compilador utilizando ferramentas Java p. 33/4 classbody exemplo ClassDeclNode Token: teste ClassBodyNode ListNode ListNode ListNode VarDeclNode ListNode ConstructDeclNode ListNode ClassDeclNode ListNode VarDeclNode MethodDeclNode ClassDeclNode

Como construir um compilador utilizando ferramentas Java p. 34/4 Caso especial StatementNode StatementNode GeneralNode VarDeclNode AtribNode IfNode PrintNode

Como construir um compilador utilizando ferramentas Java p. 35/4 statement StatementNode statement(recoveryset g) throws ParseEOFException : StatementNode s = null; try ( s = vardecl(f1) <SEMICOLON> s = atribstat(f1) <SEMICOLON> s = printstat(f1) <SEMICOLON>... ) return s;

Como construir um compilador utilizando ferramentas Java p. 36/4 StatementNode exemplo int[][] m(string b[], int c) ; c = 0;

Como construir um compilador utilizando ferramentas Java p. 37/4 StatementNode exemplo MethodDeclNode Token: int 2 Token: m MethodBodyNode ListNode BlockNode VarDeclNode ListNode ListNode Token: string ListNode VarDeclNode NopNode ListNode VarNode Token: int ListNode AtribNode Token: b 1 VarNode Token: c 0

Como construir um compilador utilizando ferramentas Java p. 38/4 StatementNode exemplo II if ( a == b) if ( c < d ) a = 10; else b = 0; c = 1024;

Como construir um compilador utilizando ferramentas Java p. 39/4 StatementNode exemplo II IfNode ExpreNode IfNode ExpreNode AtribNode BlockNode ListNode AtribNode ListNode AtribNode

Como construir um compilador utilizando ferramentas Java p. 40/4 StatementNode exemplo III for ( i = 0 ; i < a; i = i + 1) for (j = i + 1; j < b; j = j + 1) b = 0; c = 1024;

Como construir um compilador utilizando ferramentas Java p. 41/4 StatementNode exemplo III ForNode AtribNode ExpreNode AtribNode ForNode AtribNode ExpreNode AtribNode BlockNode ListNode AtribNode ListNode AtribNode

Como construir um compilador utilizando ferramentas Java p. 42/4 ExpreNode outra exceção Assim como StatementNode, o ExpreNode é uma classe abstrata.

Como construir um compilador utilizando ferramentas Java p. 42/4 ExpreNode outra exceção Assim como StatementNode, o ExpreNode é uma classe abstrata. Dela descendem tipos diferentes de nós.

Como construir um compilador utilizando ferramentas Java p. 42/4 ExpreNode outra exceção Assim como StatementNode, o ExpreNode é uma classe abstrata. Dela descendem tipos diferentes de nós. CallNode, DotNode, IndexNode, NewObjectNode, AddNode, MultNode, RelationalNode, etc.

Como construir um compilador utilizando ferramentas Java p. 43/4 ExpreNode exemplo a + b + c AddNode AddNode Token: + VarNode VarNode Token: + VarNode Token: c Token: a Token: b

Como construir um compilador utilizando ferramentas Java p. 44/4 ExpreNode exemplo II a + b.x < -3 * c[2] RelationalNode AddNode Token: < MultNode VarNode Token: + DotNode Token: * IndexNode Token: a VarNode Token: x UnaryNode VarNode intconstnode Token: b Token: - IntConstNode Token: c Token: 2 Token: 3