A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

PLP – JavaCC Java Compiler Compiler

Apresentações semelhantes


Apresentação em tema: "PLP – JavaCC Java Compiler Compiler"— Transcrição da apresentação:

1 PLP – JavaCC Java Compiler Compiler
Joabe Jesus - Prof. Augusto Sampaio

2 Agenda Compiladores Parser generators JavaCC
Analisadores léxicos e sintáticos (Parsers) Parser generators JavaCC

3 Compiladores Analisadores léxicos Analisadores sintáticos (Parsers)
Verificam se os símbolos terminais e palavras estão de acordo com as restrições da linguagem Há identificadores inválidos? Há símbolos (caracteres) inválidos Analisadores sintáticos (Parsers) Programas que recebem como entrada um arquivo fonte e diz se ele está correto sintaticamente, segundo uma gramática pré-definida.

4 Parsers Há dois grupos de parsers Top-down Bottom-up

5 Parsers Por que usar um parser generator?
Implementar um parser ‘manualmente’ (passo-a-passo) pode ser uma tarefa muito trabalhosa...

6 Parsers generators Um Parsers generator é um programa que recebe como entrada um arquivo de especificação da gramática a ser aceita pelo parser e retorna um parser que reconhece esta gramática O formato do arquivo de especificação da gramática depende muito do tipo de parser gerado (top-down ou bottom-up)

7 Parsers generators Existem vários geradores de parser JavaCC
JLex & Cup AntLR SableCC É um dos mais populares na comunidade Java, sendo suportado hoje pela comunidade java.net Tem um dos melhores suportes a gramáticas em EBNF (Extended Backus Naur Form) e gera estrutura OO da AST (Abstract Syntax Tree) além de classes utilitárias usando o padrão Visitor.

8 JavaCC

9 JavaCC Gerador de parser 100% Java Desenvolvido inicialmente pela Sun
O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun Hoje é mantido pela java.net É um parser top-down Mais fácil de depurar Utiliza uma sintaxe muito próxima de Java

10 JavaCC Desvantagens Mistura código Java com a gramática
Não checa a corretude do código Java inserido Pode gerar classes que não compilam

11 JavaCC Inclui um pré-processador para geração de árvores sintáticas (jjTree) Possui um repositório de gramáticas bastante extenso disponível – inclui linguagens como Java, C, C++, Perl, etc Possui uma interface gráfica fácil de usar Definições léxicas e sintáticas em um único arquivo Não aceita ambigüidades. Ex: A gramática não pode possuir recursão à esquerda.(ex: expr:= expr ‘+’ expr)

12 Gramáticas em JavaCC Opções do Parser (Não obrigatório)
Uma gramática JavaCC possui a seguinte estrutura: Opções do Parser (Não obrigatório) Definição da classe do Parser Definição dos Tokens (Componente Léxico) Terminais Definição das Produções (Componente Sintático) Ações semânticas associadas Não-Terminais

13 Opções do parser STATIC – diz se os métodos do parser serão estáticos (default: true) LOOKAHEAD – informa o nível de profundidade do lookahead (default: 1) DEBUG_PARSER – instrui o parser a registrar todas as informações durante o parsing do arquivo (default: false) DEBUG_LOOKAHEAD – instrui o parser a registrar também as tentativas de lookahead (default: false)

14 Mais opções UNICODE_INPUT – informa se a entrada usa a codificaçõo UNICODE OUTPUT_DIRECTORY – seta o diretório onde os arquivos java serão gerados (o default é o atual) FORCE_LA_CHECK- força a checagem do lookahead em todos os “choice points”, independente da especificação explícita do lookahead (default: false)

15 Definição do Parser Este trecho define a classe do Parser. Nesta classe, podem ser definidos métodos e variáveis auxiliares. O formato é o seguinte: PARSER_BEGIN(parser_name) ... class parser_name ...{ } PARSER_END(parser_name)

16 Definição dos tokens Serve para especificar os tipos de tokens e as expressões regulares associadas Nesta seção são descritas as palavras reservadas TOKEN: { < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? > | < DIGIT: ["0"-"9"] > | < EOL: "\n" > }

17 Definição das produções
Obedecem o seguinte formato: tipoRetorno nomeProducao(listaParametros): { código Java } subProducao1() { ação semântica correspondente } [lista de subProducoes] Declaração de variáveis, invocação de métodos, etc Código Java. Em geral, corresponde a montagem da árvore

18 Exemplo: EBNF Dada a gramática na forma EBNF
expr := number     | expr '+' expr     | expr '-' expr     | expr '*' expr     | expr '/' expr     | - expr number := digit+ ('.' digit+)? digit := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7‘ | '8' | '9'

19 Exemplo: Gramática options { LOOKAHEAD=2;
STATIC=false; } PARSER_BEGIN(Arithmetic) public class Arithmetic { } PARSER_END(Arithmetic) Lembre-se de que o JavaCC não permite recursão à esquerda, por isso, é necessário modificar a gramática antes de traduzí-la.

20 Exemplo: JavaCC SKIP: { " " | "\r" | "\t" } TOKEN:
{  < NUMBER: (<DIGIT>)+ ( "." (<DIGIT>)+ )? > | < DIGIT: ["0"-"9"] >

21 Exemplo: JavaCC double expr(): {}
{     term() ( "+" expr() | "-" expr() )* } double term(): {} {     unary() ( "*" term() | "/" term() )*

22 Exemplo: JavaCC double unary(): { } { "-" a=element() | a = element()
double element(): {} <NUMBER>

23 Exercício Altere o exemplos dados para que estes possam reconhecer as seguintes expressões: parênteses “(“ , “)” -> expr ::= (expr) exponenciação -> expr ::= expr ^ expr Onde a ordem de precedência é: parênteses > exponenciação

24 Referências https://javacc.dev.java.net/

25 PLP – JavaCC Java Compiler Compiler
Joabe Jesus - Prof. Augusto Sampaio


Carregar ppt "PLP – JavaCC Java Compiler Compiler"

Apresentações semelhantes


Anúncios Google