JavaCC e JJTree Geração de compiladores implementados em Java fonte (texto) ações árvore sintática Parser
JavaCC e JJTree JJTree é um pré-processador para o JavaCC Auxilia a definição da árvore sintática JJTree JavaCC Java Esquema de tradução
Estrutura do arquivo JavaCC options { STATIC = false; //Não criar métodos estáticos OUTPUT_DIRECTORY = "c:/temp"; //Diretório de saída dos arquivos gerados } PARSER_BEGIN(ParserExemplo) ... public class ParserExemplo { . . . PARSER_END(ParserExemplo) . . . //PRODUÇÕES BNF QUE FORMAM A GRAMÁTICA DO PARSER
Produções Parser reconhece: 1 + 1, 2 + 1, 15 + 14, . . . TOKEN : /* OPERAÇÕES */ { < SOMA: "+" > } TOKEN : /* OPERADORES */ < NUMERO: ( <DIGITO> )+ > | < #DIGITO: ["0" - "9"] > void termo() : { } { <NUMERO> } void soma() : termo() <SOMA> termo() Parser reconhece: 1 + 1, 2 + 1, 15 + 14, . . .
Produções Símbolos não-terminais da gramática são escritos exatamente como métodos em Java tipo_retorno_java identificador_java "(" lista_parametros_java ")" ":" bloco_java "{" escolhas_expansão "}” Símbolos não terminais são traduzidos como chamadas de métodos
Produções Parser reconhece: 7, 1 + 1, 2 + 2 + 3, . . . void soma() : { } { termo() <SOMA> expressao() } void expressao() : { } { soma() | termo() } Parser reconhece: 7, 1 + 1, 2 + 2 + 3, . . .
Produções + Ações Parser retorna o resultado da operação. { a = termo() <SOMA> b = expressao() {return a + b;} } int expressao() : {int result;} ( result = soma() | result = termo() ) {return result;} int termo() : { Token t; } { t = <NUMERO> return (new Integer(t.image) ).intValue(); } int soma() : {int a, b;} Parser retorna o resultado da operação.
Tokens TOKEN : { < NUMERO: ( <DIGITO> )+ > | < PALAV1: “a” (“b” | “c”)* > } . TOKEN Tokens da gramática SPECIAL_TOKEN Tokens que não têm significado durante o parsing, entretanto ainda é acessível SKIP Tokens simplesmente descartados MORE Armazena em um buffer até: encontrar um TOKEN/SPECIAL_TOKEN Concatena em um só TOKEN/ SPECIAL_TOKEN encontrar um SKIP Descarta
JJTree void Soma() : void Termo() : {} {} { termo() <SOMA> expressao() } void Expressao() : soma() | termo() void Termo() : {} { t = <NUMERO> }
JJTree void Soma() : void Termo() : {} { Token t; } { termo() <SOMA> expressao() } Expressao Expressao() : ( soma() | termo() ) {return jjtThis;} void Termo() : { Token t; } { t = <NUMERO> jjtThis.setValor ( (new Integer(t.image) ).intValue() ); }
Referências http://www.di.ufpe.br/~java http://www.di.ufpe.br/~java/docs/JavaCC/doc/DOC/