Académique Documents
Professionnel Documents
Culture Documents
JFLEX e CUP
Esquema da operao
.jflex .java .java .cup
JFLex JCup
Descrio em Descrio em
gramtica regular gramtica livre de
javac contexto
Analisador Analisador
Lxico Sinttico
http://jflex.de/index.html
Cdigo do usurio
O cdigo escrito nessa seo copiado diretamente no topo do
arquivo do scanner
Diretivas
Permite a definio de diretivas, macros e nome de estados
Principais diretivas:
%init{...%init}
Tudo que voc escrever entre as chaves vai ser copiado diretamente para o
mtodo construtor da classe do scanner
%eof{...%eof}
Permite declarar cdigo que vai ser executado quando o scanner encontrar o
fim do arquivo de entrada
%char
Ativa o contador de caracteres atravs da varivel inteira yychar
%cup
Ativa a compatibilidade com o JCup. Isso significa que a classe gerada do
scanner vai implementar a interface java_cup.runtime.Scanner
%class <nome>
Muda o nome da classe do scanner (default = Yylex).
%debug
Gera o public static void main(...)
Diretivas (Macros)
So abreviaes para expresses regulares
Formato:
<nome> = <definio>
Diretivas (Macros)
Macros podem conter outras macros.
Exemplos:
DIGITO = [0-9]
ALFA = [A-Za-z]
ESPACO_EM_BRANCO = [\n\r\x20\t]
NUM_NATURAL = {DIGITO}+
Diretivas (Estados)
Permite implementar uma mquina de estados no scanner.
Exemplo:
%state COMMENT
Exemplos:
{DIGITO}+ representa uma expresso que casa com os nmeros
naturais
<ao> - obrigatrio.
Uma ao o trecho de cdigo que deve ser executado quando uma
regra for aplicada pelo scanner
Voc pode fazer uso das variveis yytext (String), yychar (int) e yyline
(int) dentro do cdigo de suas aes.
http://www2.cs.tum.edu/projects/cup/
Seo 4: gramtica
Diretivas
parser code {: ... :};
Permite que voc declare variveis e mtodos na classe do parser. Similar
diretiva %{...%} do JFlex
init with {: ... :};
O cdigo entre chaves vai ser executado antes que o parser pea o primeiro
token ao scanner
scan with {: ... :};
Serve para que voc escreva o cdigo que o parser vai executar sempre que
ele quiser pedir um token ao scanner. Se essa diretiva no for utilizada, o
parser chama scanner.next_token() para receber tokens.
As produes tm o formato:
no-terminal ::= <smbolos e aes>
Seo 4 Gramtica
Exemplo:
expr ::= NUMBER:n
{:
RESULT=n;
:}
| expr:r PLUS expr:s
{:
RESULT=new Integer(r.intValue() + s.intValue());
:}