Vous êtes sur la page 1sur 27

Construo de Compiladores

JFLEX e CUP

Universidade Federal da Paraba


Departamento de Informtica
Introduo

Analisadores lxicos e sintticos so construdos a partir


de especificaes formais
Gramticas Regulares / Autmatos finitos
Gramticas Livre de contexto

A formalidade das descries permite que tais


analisadores sejam automaticamente construdos
Programas que geram programas

Universidade Federal da Paraba


Departamento de Informtica
Introduo
Analisadores Lxicos em C Analisadores Lxicos em Java
Lex JLex
Flex JFlex

Analisadores Sintticos em C Analisadores Sintticos em Java


Bison JCup
YACC BYACC/B

Lxico e Sinttico em C Lxico e Sinttico em Java


ANTLR JavaCC
SableCC
ANTLR

Universidade Federal da Paraba


Departamento de Informtica
JFLex e JCup

Esquema da operao
.jflex .java .java .cup

JFLex JCup

Descrio em Descrio em
gramtica regular gramtica livre de
javac contexto

Analisador Analisador
Lxico Sinttico

Arquivo fonte Arquivo de tokens Arvore sinttica


.class
Universidade Federal da Paraba
Departamento de Informtica
JFLEX
Gerador de Analisadores Lxicos

http://jflex.de/index.html

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Arquivo de especificao (.jflex)


Dividido em trs sees:
Cdigo do usurio
Diretivas
Regras de Expresses Regulares

Cada seo separada da seo seguinte por uma linha


contendo apenas %%

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Cdigo do usurio
O cdigo escrito nessa seo copiado diretamente no topo do
arquivo do scanner

til para declarar imports e nome de pacotes

Universidade Federal da Paraba


Departamento de Informtica
JFlex

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

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Principais diretivas (continuao)


%line
Ativa o contador de linhas atravs da varivel inteira yyline

%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(...)

Universidade Federal da Paraba


Departamento de Informtica
JFlex
Cdigo includo entre %...% copiado literalmente na classe gerada
Declarao de variveis
Declarao de funes

Identificadores para variveis e funes no devem ser iniciados


com yy

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Diretivas (Macros)
So abreviaes para expresses regulares

Cada macro deve estar contida numa nica linha

Formato:
<nome> = <definio>

O nome da macro deve comear com uma letra ou _.

A definio da macro uma expresso regular.

Universidade Federal da Paraba


Departamento de Informtica
JFlex

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}+

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Diretivas (Estados)
Permite implementar uma mquina de estados no scanner.

Todo scanner tem pelo menos um estado (declarado


internamente) chamado YYINITIAL.

Exemplo:
%state COMMENT

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares


Formato das regras:
[<estados>] <expresso> { <ao> }

[<estados>] opcional. Formato:


<estado0, estado1, ..., estadoN>

Se uma regra for precedida por uma lista de estados, o scanner s


tentar aplicar a regra se ele estiver em um dos estados listados

Se uma lista de estados no for especificada para uma regra, o


scanner sempre tentar aplicar a regra independentemente do seu
estado atual

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares


<expresso> obrigatrio.
Baseadas em expresses regulares
Smbolos especiais:
| - representa uma opo. Exemplo: e|f significa que a expresso
pode casar com e ou f.
. (ponto) - casa com qualquer carter, exceto o \n.
* - casa com zero ou mais repeties da expresso regular
precedente
Exemplo: [a-z]* casa com {, a, aa, ab, ...}
+ - casa com uma ou mais repeties da expresso regular
precedente.
Exemplo: [0-9]+ casa com qualquer nmero natural.

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares


<expresso> obrigatrio.
Smbolos especiais (cont.):
? casa com zero ou uma ocorrncia da expresso regular
precedente. Exemplo: [+ -]?[0-9]+ casa com nmeros naturais
precedidos ou no por um sinal de - ou + {0, 1, -1, +1, -123,
+456, ...}

(...) os parnteses so usados para agrupar expresses regulares.


Exemplo: (ab)* {, ab, abab, ababac, ...} enquanto que ab* {a,
ab, abb, abbb, ...}

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares


<expresso> obrigatrio.
Smbolos especiais (cont.):
[...] usado para denotar uma classe de caracteres
Exemplo: [a-z] casa com qualquer letra de a at z

Se o smbolo seguinte ao [ for o circunflexo (^), o contedo do [...]


negado.
Exemplo: [^0-9] casa com tudo exceto dgitos.

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares


<expresso> obrigatrio.
Expresses podem conter macros desde que essas sejam
escritas entre chaves

Exemplos:
{DIGITO}+ representa uma expresso que casa com os nmeros
naturais

{ALFA}({ALFA}|{DIGITO}|_)* a expresso que casa com nomes de


variveis na maioria das linguagens de programao

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares

<ao> - obrigatrio.
Uma ao o trecho de cdigo que deve ser executado quando uma
regra for aplicada pelo scanner

possvel trocar o estado do scanner dentro de uma ao atravs de


chamada ao mtodo interno yybegin(nome_do_estado)

Voc pode fazer uso das variveis yytext (String), yychar (int) e yyline
(int) dentro do cdigo de suas aes.

Universidade Federal da Paraba


Departamento de Informtica
JFlex

Regras de expresses regulares (observaes)


Se mais de uma regra casar com a string de entrada, o scanner escolhe
a regra que casa com a maior substring da string. Exemplo:
String: abcd
Regra 1: ab { acao1(); }
Regra 2: [a-z]+ { acao2(); }
O scanner vai escolher a regra 2.

Todas as seqncias de caracteres passadas como entrada para o


scanner devem casar com alguma das regras. Caso isso no ocorra, o
scanner vai gerar um erro

Universidade Federal da Paraba


Departamento de Informtica
JCup
Gerador de Analisadores Sintticos

http://www2.cs.tum.edu/projects/cup/

Universidade Federal da Paraba


Departamento de Informtica
JCup

Dividido em quatro sees:

Seo 1: declarao de packages e imports que sero inseridos no


topo do arquivo gerado pelo JCup e diretivas do JCup

Seo 2: declarao de terminais e no-terminais

Seo 3: precedncia e associatividade de terminais

Seo 4: gramtica

Universidade Federal da Paraba


Departamento de Informtica
JCup
Seo 1 -Especificao de packages e imports. Exemplo:
package compilador.parser;
import compilador.scanner;

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.

Universidade Federal da Paraba


Departamento de Informtica
JCup
Seo 2 - Lista de smbolos
terminal [classe] nome0, nome1, ...;
non terminal [classe] nome0, nome1, ...;

Em tempo de execuo, os smbolos so representados por objetos da classe


java_cup.runtime.Symbol. Essa classe possui uma varivel chamada value
que contm o valor do smbolo. Exemplo:
terminal Integer NUMERO;
Quando o parser recebe do scanner um NUMERO, ele cria um objeto da classe
Symbol. A varivel value ser um objeto da classe Integer. Assim, o valor do
nmero pode ser obtido atravs de simbolo.value.intValue();

Se no for fornecida uma classe na declarao do (non) terminal, a varivel


value ficar com valor null.

Os nomes dos (non) terminais no podem ser palavras reservadas do JCup:


"code", "action", "parser", "terminal", "non", "nonterminal", "init", "scan", "with",
"start", "precedence", "left", "right", "nonassoc", "import", e "package"

Universidade Federal da Paraba


Departamento de Informtica
JCup

Seo 3 - Precedncia e Associatividade


precedence left terminal[, terminal...];
precedence right terminal[, terminal...];
precedence nonassoc terminal[, terminal...];

A precedncia cresce de cima para baixo, por exemplo:


precedence left ADD, SUBTRACT;
precedence left TIMES, DIVIDE;

Significa que a multiplicao e a diviso tm maior precedncia.

Universidade Federal da Paraba


Departamento de Informtica
JCup
Seo 4 - Gramtica
Especifica as produes da gramtica da linguagem.

start with non-terminal; (diretiva opcional)


Indica qual o no-terminal inicial da gramtica. Se essa diretiva for omitida,
o parser assume o primeiro no-terminal declarado nas produes da
gramtica.

As produes tm o formato:
no-terminal ::= <smbolos e aes>

Os smbolos direita de ::= podem ser terminais ou no-terminais.

As aes correspondem ao cdigo que executado quando a regra de


produo aplicada

Universidade Federal da Paraba


Departamento de Informtica
JCup

Seo 4 Gramtica
Exemplo:
expr ::= NUMBER:n
{:
RESULT=n;
:}
| expr:r PLUS expr:s
{:
RESULT=new Integer(r.intValue() + s.intValue());
:}

Observe que pode-se especificar vrias produes para um mesmo no


terminal atravs do uso da barra |. Pode-se nomear smbolos para
poder referenci-los no cdigo da ao. O resultado da produo deve
ser armazenado na varivel implcita RESULT. O tipo de RESULT o
mesmo que foi declarado na seo 2.

Universidade Federal da Paraba


Departamento de Informtica

Vous aimerez peut-être aussi