De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 31 de Julho de 2004
O programa JavaCC é um gerador de analisador sintático que produz código Java. Ele permite que uma determinada linguagem seja definida de maneira simples, por meio de uma notação semelhante à EBNF. Como saída produz o código-fonte de algumas classes Java que implementam os analisadores léxico e sintático para aquela linguagem. Provê também maneiras de incluir, junto à definição da linguagem, código Java para, por exemplo, construir-se a árvore de derivação do programa analisado.
O JavaCC foi inicialmente desenvolvido pela Sun que depois de algum tempo passou seu desenvolvimento para a Metamata Inc. que, depois, foi incorporada pela Webgain Inc. Sua versão encontra-se num repositório da própria Sun. Para os interessados em conhecer melhor o JavaCC, sua página na Internet é https://javacc.dev.java.net/. Na página pode-se encontrar ainda um link para uma série de gramáticas prontas para utilização pelo JavaCC. São gramáticas, por exemplo, de Java, C, C++, SQL, HTML, e muitas outras.
O JavaCC define uma linguagem própria para descrição, em um único arquivo, do analisador léxico e do analisado sintático. Iniciando com o analisador léxico, esta linguagem permite que cada token seja definido na forma de uma expressão regular que pode ser tão simples como
TOKEN : { < CLASS: "class" > } ou mais complexos como TOKEN : { < string_constant: // constante string como "abcd bcda" "\""( ~["\"","\n","\r"])* "\"" > }
Em ambos os casos, os tokens definidos entre < > serão utilizados como constantes inteiras, acessíveis dentro do analisador léxico. Além de tokens, podem ser definidos no analisador léxico quais caracteres ou expressões devem ser ignorados e também os tokens especiais que são tokens que não são passados para o analisador sintático mas são armazenados e podem ser recuperados a partir de um token normal.
As declarações para o analisador sintático correspondem às produções da gramática que se deseja implementar. O JavaCC utiliza a técnica descendente recursiva de análise. Nessa abordagem cada não terminal da gramática é implementado através de um método que, quando chamado, procura reconhecer na entrada a estrutura do não terminal.
Seguindo a filosofia da análise descendente recursiva, as declarações dos não terminais são parecidas com a declaração de um método. A diferença é que o corpo do não terminal possui as produções descritas através de seqüências de tokens e estruturas de repetição, escolhas ou opcionais. Um exemplo simples retirado dos exemplos do próprio JavaCC é mostrado a seguir. Nele, além da produção propriamente dita, associou-se código Java que é executado quando ocorre o casamento da entrada com uma parte da produção.
void Input() : { int count; } { count=MatchedBraces() <EOF> { System.out.println("The levels of nesting is " + count); } } int MatchedBraces() : { int nested_count=0; } { <LBRACE> [ nested_count=MatchedBraces() ] <RBRACE> { return ++nested_count; } }
O código associado às produções podem ser bem mais complexos. Pode-se armazenar o valor dos tokens reconhecidos e pode-se ter até mesmo blocos "try/catch", como em Java. Em geral, o código associado à produção é utilizado para construir-se a árvore sintática do programa analisado.
Existem também programas que, trabalhando junto com o Javacc, auxiliam na geração da árvore sintática e das classes para fazer as visitas aos nós dessa árvore. O próprio JavaCC possui o JJTree. Ele é um pré-processador para o arquivo da gramática (sem código associado às produções), que insere o código necessário para a criação da árvore sintática. O resultado é um arquivo que deve, então, ser processado pelo JavaCC. Através de certas anotações no arquivo original, processado pelo JJTree o programador pode de certo modo customizar a criação da árvore.
Resumindo, o JavaCC é uma ferramenta bastante poderosa, flexível e com um pouco de prática, fácil de utilizar. Além disso, seu extenso uso pela comunidade tem disponibilizado diversas facilidades extras como ferramentas e gramáticas que o tornam ainda mais atrativo.
A editora Novatec acabou de publicar o livro "Como Construir um Compilador Utilizando Ferramentas Java" de autoria do professor Márcio Delamaro, que mostra, com detalhes, todos os passos da utilização do JavaCC no desenvolvimento de um compilador. O livro tem, ainda, uma abordagem interessante para abordar a geração de código, mostrando como gerar código para a própria JVM (Máquina Virtual Java).
Saiba mais sobre o livro em http://novateceditora.com.br/livros/compilador/
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários