Carregar apresentação
A apresentação está carregando. Por favor, espere
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.