Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 28
Aula 28
sobre
ferramentas
alternativas:
permitem
um
rpido
Este material est baseado em Levine, Mason & Brown, lex & yacc, OReilly & Associates, Inc., 1995.
token
Analisador
lxico
Analisador
sinttico
rvore
sinttica
Tabela
de
smbolos
1.1. Lex
a ferramenta de automatizao da anlise lxica a ser estudada utiliza o
comando lex disponvel no UNIX (ou seu correspondente flex da GNU). O
programa Lex produz automaticamente um analisador lxico a partir de
especificaes de expresses regulares, passveis de representao na forma
de autmatos finitos.
o programa Lex geralmente utilizado conforme ilustrado na figura 2. O
formato geral para a especificao de uma gramtica regular em Lex
definies
/* opcional */
%%
regras
%%
rotinas do usurio
/* opcional */
programa-fonte
do Lex
lex.l
Compilador
lex.yy.c
Lex
Compilador
lex.yy.c
a.out
Seqncia
de
entrada
a.out
Seqncia
de
tokens
frac
.[0-9]+
nl
\n
2. a incluso das linhas de comando em C, que devem ser delimitadas por <%{>
e <%}>, como:
%{
#include <y.tab.h>
extern int yylval;
%}
a redefinio dos tamanhos das tabelas utilizadas pelo gerador, tais como
nmero de ns da rvore sinttica, nmero de transies e nmero de estados.
quando h mais de uma regra que case com a maior seqncia de caracteres,
escolher aquela que aparece primeiro na seo de regras.
embora o Lex seja relativamente simples de entender, ele freqentemente
associado ao Yacc (j no to simples) em aplicaes no domnio dos
compiladores. No entanto, o Lex pode (e deve) ser utilizado tambm como
uma ferramenta nica.
10
yacc gera a funo yyparse( ), que analisa os itens lxicos e decide se eles
formam ou no uma sentena vlida.
11
{aes semnticas}
%%
rotinas do usurio (contm a funo principal main( ) e outras rotinas do
usurio)
12
14
Gramtica
especificada no
formato LEX
num arquivo
com extenso
*.l
lex
ou flex
Gramtica
especificada no
formato YACC
num arquivo
com extenso
*.y
yacc
ou bison
Analisador lxico
yylex()
no arquivo lex.yy.c
Analisador sinttico
yyparse() no arquivo
filename.tab.c
Outros
programas
em C
cc
Rotinas das
bibliotecas libl.a e
liby.a
Programa
printf("%c", yytext[0]+'a'-'A');
ECHO;
p2.l
%{
int nlin=0;
%}
Qqchar
NovaLinha
%%
.*
[\n]
p3.l
Dia
[" "](00-11)[:]
Tarde
[" "](12-17)[:]
Noite
[" "](18-23)[:]
%%
{Dia}
printf("\nBom Dia !\n");
{Tarde} printf("\nBoa Tarde !\n");
{Noite} printf("\nBoa Noite !\n");
.
p5.l
%%
[.]
;
then
;
var
;
[{]
printf("/*");
[}]
printf("*/");
mod
printf("%%");
or
printf("||");
and
printf("&&");
begin
printf("{");
end
printf("}");
program.*[(].*$ printf("main()\n{");
[^:><][=]
printf("==");
[:][=]
printf("=");
[<][>]
printf("!=");
^.*integer;
ShuffleInt();
.
ECHO;
%%
ShuffleInt()
{ int i;
printf("int ");
for(i=0; yytext[i]!=':'; i++) printf("%c", yytext[i]);
printf(";");
}
18
p6.l
%%
[1-9][0-9]*
0[0-7]+
0[x|X][0-9A-Fa-f]+
.?
printf("Decimal\n");
printf("Octal\n");
printf("\nHexadecimal\n");
printf("Nao numerico\n");
*******************************
Calculadora (lex)
*******************************
%{
#include "y.tab.h"
%}
integer
[0-9]+
nl
\n
%%
[ \t]+
;
{integer} {sscanf(yytext,"%d",&yylval.integer);return INTEGER;}
{nl}
{extern int lineno; lineno++; return '\n'; }
.
{return yytext[0];}
%%
19
*******************************
Calculadora (yacc)
*******************************
%{
#include <stdio.h>
%}
%union {
double real;
int integer;
}
%token <integer> INTEGER
%type <integer> expr;
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%%
lines: /* nothing */
| lines line
;
line: '\n'
| expr '\n' {printf("%d\n", $1);}
| error '\n' {yyerror();}
;
20
expr: INTEGER
| expr '+'
| expr '-'
| expr '*'
| expr '/'
expr
expr
expr
expr
{$$ = $1 + $3;}
{$$ = $1 - $3;}
{$$ = $1 * $3;}
{if($3) $$ = $1 / $3;
else {
yyerror("divide by zero");
}
}
| '(' expr ')' {$$ = $2;}
| '-' expr %prec UMINUS {$$ = - $2;}
;
%%
int lineno = 0;
main(){
yyparse();
}
yyerror(s)
char *s;
{
printf("calc: %s", s);
printf("line %d\n", lineno);
}
21
*******************************
Calculadora "cientfica" (lex)
*******************************
%{
#include "y.tab.h"
%}
integer
real
nl
%%
[ \t]+ ;
{integer}
{real}
{nl}
sin
cos
tan
.
%%
[0-9]+
[0-9]*"."[0-9]*
\n
22
*******************************
Calculadora "cientfica" (yacc)
*******************************
%{
#include <stdio.h>
#include <math.h>
%}
%union {
double real;
int integer;
}
%token <integer> INTEGER
%token <real> REAL
%token SIN COS TAN
%type <integer> expr_i;
%type <real> expr;
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%%
lines: /* nothing */
| lines line
;
23
line: '\n'
| expr '\n' {printf("%lf\n", $1);}
| error '\n' {yyerror();}
;
expr_i: INTEGER;
expr: REAL
| expr_i {$$ = $1;}
| SIN '(' expr ')' {$$ = sin($3);}
| COS '(' expr ')' {$$ = cos($3);}
| TAN '(' expr ')' {$$ = tan($3);}
| expr '+' expr {$$ = $1 + $3;}
| expr '-' expr {$$ = $1 - $3;}
| expr '*' expr {$$ = $1 * $3;}
| expr '/' expr {if($3) $$ = $1 / $3;
else {
yyerror("divide by zero");
}
}
| '(' expr ')' {$$ = $2;}
| '-' expr %prec UMINUS {$$ = - $2;}
;
24
%%
int lineno = 0;
main(){
yyparse();
}
yyerror(s)
char *s;
{
printf("calc: %s", s);
printf("line %d\n", lineno);
}
4. Autmatos finitos
Definio: Um autmato finito M uma quntupla ordenada M = {S, s0, F, A, g}:
1. S um conjunto finito de estados;
2. s0 S o estado inicial;
3. F S um conjunto de estados finais;
4. A um alfabeto de entrada;
5. g: S A S um conjunto finito de aplicaes de transio.
25
5. Expresses regulares
Uma expresso regular um objeto matemtico especfico que permite a escrita concisa
de uma seqncia vlida de caracteres. Para tanto, so utilizados operadores na forma de
metacaracteres, sendo que os mais comuns so apresentados na tabela 1.
Mesmo sabendo ser possvel descrever a sintaxe lxica de uma linguagem utilizando
gramticas livres de contexto, esta descrio geralmente feita por meio de expresses
regulares pelas seguintes razes:
1. as regras lxicas de uma linguagem so geralmente muito simples, no necessitando
uma descrio gramatical (recurso demasiadamente poderoso para tal fim);
2. expresses regulares geralmente fornecem uma notao mais concisa e fcil de entender
do que a correspondente representao gramatical;
3. analisadores lxicos automticos construdos a partir de expresses regulares so mais
eficientes que aqueles construdos a partir de gramticas arbitrrias.
26
Significado
Exemplo
a expresso anterior opcional
54?1 541 ou 51
qualquer repetio, inclusive vazio
a* {,a,aa,...}
qualquer repetio, exclusive vazio
a+ {a,aa,...}
alternativa entre duas expresses
a|b a ou b
agrupamento de expresses
qualquer caracter, exceto linefeed
casa com o incio de uma linha, exceto quando est
entre [ ], quando significa complemento.
fim de uma linha
qualquer caracter especificado
[abc] {a,b,c}
dentro de [ ], qualquer caracter entre os extremos
[0-9] {0,1,2,3,4,5,6,7,8,9}
indica o nmero de repeties permitido, ou substitui
a{1,2} {a,aa}
uma definio macro
{digito} [0-1]+
permite interpretar o prximo caracter como caracter
. \.
comum. tambm utilizado para representar
\t tabulao
caracteres no-imprimveis
\b blank
\n linefeed
especifica um conjunto de seqncias seguida de uma [012]+/Y aceita qualquer
expresso
seqncia composta de 0, 1 e
2 seguida de Y
27
Exerccios
1. Apresente a expresso regular mais compacta que seja capaz de descrever
qualquer nmero decimal positivo (e somente eles), com a parte inteira sendo
separada da parte fracionria por ponto, quando for o caso. Por exemplo, so
seqncias vlidas: 0.89 / 12 / 4.0 / .32748 / 34.52
2. Como uma alternativa expresso regular obtida acima, apresente o autmato
finito que permite validar ou no qualquer nmero decimal positivo. Resolva
a questo com base nas seguintes hipteses:
existem dois tipos de smbolos terminais ou eventos: "[0-9]" e ".";
utilize dois estados finais, lembrando que a seqncia de caracteres s vlida
se for atingido um estado final e no houver mais caracteres a processar.
para qualquer estado, deve haver uma lei de transio de estados a partir de
cada um dos eventos existentes.
28