Escolar Documentos
Profissional Documentos
Cultura Documentos
Origem
O YACC foi um dos primeiros analisadores
sintticos, escrito entre 1975 e 1978.
Esse nome vem de yet another compiler
compiler, sugerindo que outras pessoas estavam
escrevendo parsers na mesma poca.
Na dcada de 1980 o yacc sofreu atualizaes,
foram implementadas diversas caractersticas
adicionais que resultou na verso corrente do
BISON, distribudo sob a Licena Pblica GNU.
Origem
Em 1975 surgiu o Lex, um gerador de analisador lxico.
Lex tornou-se rapidamente popular, a despeito de ser
relativamente lento e apresentar bugs.
O Lex foi feito, originalmente, em ratfor, uma extenso do
FORTRAN, popular na poca.
Em 1987 foi reescrito em C e chamado de Flex, de Fast
Lexical Analizer Generator.
Atualmente um projeto da SouceForge, ainda sob licena da
Berkeley.
Introduo ao FLEX
}%
/* Definies regulares */
Expresses regulares que definem os padres a serem reconhecidos
%% regras de traduo
Formato
p1 {ao}
... ....
pn {ao}
onde, pi uma expresso regular e cada ao um fragmento de
programa descrevendo a ao a ser tomada quando o padro for
reconhecido
%%
Procedimentos auxiliares
Contm procedimentos que sejam necessrios para execuo das aes.
Cdigo nesta seo diretamente copiado para cdigo na linguagem alvo
Declaraes C
Nessa seo podem constar declaraes de
funes, declaraes de variveis, #includes, etc.
Exemplos:
#include <string.h>
char *arquivo de saida
int linha = 0;
struct {int a;
float b;}
Definies regulares
A definio de um scanner FLEX usa uma rica
linguagem de expresses regulares.
Caracteres com significado especial em expresses
regulares:
. Casa com um caractere simples, exceto nova linha (\n).
Ex: . {caractere++;}
[ ] uma classe de caracteres que casa com qualquer
caractere entre colchetes.
Exemplo: letra [a-z] o hfen indica intervalo, ou
seja, qualquer letra no intervalo entre a e z.
letra [A-Za-z]
digito [0-9]
id
{letra}({letra}|{digito})*
Regra de traduo
Diz o que fazer quando encontra um padro
especificado nas definies regulares.
Exemplo:
leia
{numero}
Exemplo
Regras de traduo
%%
{ws}
if
then
else
{id}
{numero}
%%
{}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",RES,yytext);}
{printf("< %s, %s>\n",ID,yytext);}
{printf("< %s, %s>\n",NUM,yytext);}
Procedimentos auxiliares
int main( )
{
yylex();
Exerccio
a) escolher 3 comandos da linguagem criada por voc;
b) Fazer um programa FLEX para receber uma entrada
pelo teclado, uma linha de programa na sua linguagem
com qualquer um dos comandos escolhidos e retornar
os tokens dessa entrada:
operador lgico: op log + operador encontrado
operador matemtico: op mat + operador
Palavra reservada: Reservada + token (as palavras
correspondentes aos comandos escolhidos).
Nmero: numero + token.
identificador