JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido...
-
Upload
ricardo-bastos-caires -
Category
Documents
-
view
243 -
download
6
Transcript of JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido...
![Page 1: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/1.jpg)
JavaCC
![Page 2: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/2.jpg)
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
![Page 3: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/3.jpg)
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
![Page 4: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/4.jpg)
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)
![Page 5: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/5.jpg)
JavaCC
• Instalação
– Via Eclipse MarketPlace
OU
– Update site: http://eclipse-javacc.sourceforge.net/
![Page 6: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/6.jpg)
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
![Page 7: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/7.jpg)
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
![Page 8: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/8.jpg)
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)
![Page 9: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/9.jpg)
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" > }
![Page 10: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/10.jpg)
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
![Page 11: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/11.jpg)
Exemplo: BNF SOMA
Calculadora ::= Soma | SubtracaoSoma ::= Numero “+” NumeroSubtracao ::= Numero “-” NumeroNumero::= [0-9]+
![Page 12: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/12.jpg)
Exemplo: EBNF
Programa ::= ExpressaoExpressao ::= Valor | ExpUnaria | ExpBinariaValor ::= ValorConcretoValorConcreto ::= ValorInteiro | ValorBooleano | ValorStringExpUnaria ::= "-" Expressao | "not" Expressao | "length" ExpressaoExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao
| Expressao "and" Expressao| Expressao "or" Expressao| Expressao "==" Expressao| Expressao "++" Expressao
![Page 13: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/13.jpg)
Exemplo: EBNF
Programa ::= ExpressaoExpressao ::= Valor | ExpUnaria | ExpBinariaValor ::= ValorConcretoValorConcreto ::= ValorInteiro | ValorBooleano | ValorStringExpUnaria ::= "-" Expressao | "not" Expressao | "length" ExpressaoExpBinaria ::= Expressao "+" Expressao | Expressao "-" Expressao
| Expressao "and" Expressao| Expressao "or" Expressao| Expressao "==" Expressao| Expressao "++" Expressao
Lembre-se de que o JavaCC não permite recursão à
esquerda, por isso, é necessário modificar a
gramática antes de traduzí-la.
![Page 14: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/14.jpg)
Exemplo: EBNF
Programa ::= ExpressaoExpressao ::= ExpressaoParExpressaoPar ::= ExpCondicionalOr ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)*ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)*ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)?ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)*ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)*ExpUnaria ::= "-" Expressao | "not" Expressao | ValorConcretoValorConcreto ::= ValorInteiro | ValorBooleano | ExpParExpPar ::= “(“Expressao“)”
![Page 15: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/15.jpg)
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
![Page 16: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/16.jpg)
Exemplo: EBNF
Programa ::= ExpressaoExpressao ::= ExpressaoParExpressaoPar ::= ExpCondicionalOr ExpCondicionalOr ::= ExpCondicionalAnd ("or" ExpCondicionalAnd)*ExpCondicionalAnd ::= ExpIgualdade ("and" ExpIgualdade)*ExpIgualdade ::= ExpAritmetica ("==" ExpAritmetica)?ExpAritmetica ::= ExpConcatenacao (("+" | "-") ExpConcatenacao)*ExpConcatenacao ::= ExpUnaria ("++" ExpUnaria)*ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao | ValorConcretoValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ExpParExpPar ::= “(“Expressao“)”
![Page 17: JavaCC. Gerador de parser 100% Java –O mais utilizado pela comunidade Java Desenvolvido inicialmente pela Sun –Hoje é mantido pela java.net É um parser.](https://reader035.fdocument.pub/reader035/viewer/2022081507/5706384c1a28abb8238f6746/html5/thumbnails/17.jpg)
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