JavaCC
JavaCC
• Gerador de parser 100% Java
– 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
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
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)
JavaCC
• Instalação
– Via Eclipse MarketPlace
OU
– Update site: http://eclipse-javacc.sourceforge.net/
Gramáticas em JavaCC
•
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
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)
• IGNORE_CASE– instrui o parser a ser ou não case sensitive
(default: false)
• DEBUG_PARSER – instrui o parser a registrar todas as
informações durante o parsing do arquivo (default: false)
• Mais opções : https://javacc.java.net/doc/javaccgrm.html
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)
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" >
}
Definição das produções
• Obedecem o seguinte formato:
tipoRetorno nomeProducao(listaParametros):
{
Declaração de variáveis,
código Java
invocação de métodos, etc
}
{
subProducao1()
{ ação semântica correspondente }
[lista de subProducoes]
}
Código Java. Em geral,
corresponde a montagem da
árvore
Exemplo: BNF SOMA
Calculadora ::= Soma | Subtracao
Soma ::= Numero “+” Numero
Subtracao ::= Numero “-” Numero
Numero::= [0-9]+
Exemplo: EBNF
Programa ::= Expressao
Expressao ::= Valor | ExpUnaria | ExpBinaria
Valor ::= ValorConcreto
ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString
ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao
ExpBinaria ::= Expressao "+" Expressao
| Expressao "-" Expressao
| Expressao "and" Expressao
| Expressao "or" Expressao
| Expressao "==" Expressao
| Expressao "++" Expressao
Exemplo: EBNF
Lembre-se de que o JavaCC
Programa ::= Expressao
Expressao ::= Valor | ExpUnaria | ExpBinaria não permite recursão à
esquerda, por isso, é
Valor ::= ValorConcreto
necessário modificar a
ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString
gramática antes de traduzí-la.
ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao
ExpBinaria ::= Expressao "+" Expressao
| Expressao "-" Expressao
| Expressao "and" Expressao
| Expressao "or" Expressao
| Expressao "==" Expressao
| Expressao "++" Expressao
Exemplo: EBNF
Programa ::= Expressao
Expressao ::= ExpressaoPar
ExpressaoPar ::= ExpCondicionalOr
ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)*
ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)*
ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)?
ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)*
ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)*
ExpUnaria ::= "-" Expressao | "not" Expressao | ValorConcreto
ValorConcreto ::= ValorInteiro | ValorBooleano | ExpPar
ExpPar ::= “(“Expressao“)”
Exercício
• Altere o exemplos dados para que estes
possam reconhecer as seguintes expressões:
– exponenciação -> expr ::= expr ^ expr
– Valor concreto String e a expressão “length”
• Acrescente o que for necessário para fazer o
parser de Expressões2
Exemplo: EBNF
Programa ::= Expressao
Expressao ::= ExpressaoPar
ExpressaoPar ::= ExpCondicionalOr
ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)*
ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)*
ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)?
ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)*
ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)*
ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao | ValorConcreto
ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ExpPar
ExpPar ::= “(“Expressao“)”
Referências
•
•
•
•
•
•
https://javacc.dev.java.net/
https://javacc.dev.java.net/doc/docindex.html
http://www.cs.aau.dk/~bt/SPOF07/Lecture4.htm
http://www.antlr.org/works/index.html
http://en.wikipedia.org/wiki/Top-down_parsing
http://en.wikipedia.org/wiki/Bottom-up_parsing
PLP – JavaCC
Java Compiler Compiler
Joabe Jesus - [email protected]
Prof. Augusto Sampaio
Download

Aula Prática sobre JavaCC