Você está na página 1de 22

Lex & Yacc

Lex
Lex: O lex um gerador de analisador
lxico. O seu propsito e transformar
uma srie de smbolos em tokens.
O mesmo recebe uma especificao
num arquio de extenso .l! contendo o
con"unto de express#es regulares que
dee recon$ecer e as a#es
associadas a cada token recon$ecido.

%strutura
Um programa lex dividido em trs
partes, separadas pelos smbolos %%
declaraes
%%
regras de traduo
%%
procedimentos auxiliares

%strutura
&rimeira parte do arquio lex' declara#es
( )a seo de declara#es so feitas as declara#es
de ari*eis defini#es e inclus#es de arquios
entre +, +-
( &odemos definir express#es regulares para
nota#es non.terminais
notao regular_expression
( %sta notao pode acontecer tanto na primeira
parte do arquio quanto na segunda! desde que se"a
feita entre , -

Example:
%{
#include "calc.h"
#include <stdio.h>
#include <stdlib.h>
%}
! "egular expressions !
! ################### !
$hite %&t&n '(
letter %)#*a#+'
digit,- %-#.' ! base ,- !
digit,/ %-#.)#0a#1' ! base ,/ !
identi1ier {letter}2_3{letter}3{digit,-}4!
int,- {digit,-}(
exponant %e5'%(#'6{int,-}
real {int,-}2"."{int,-}46{exponant}6

Regular expressions
x the "x" character
. any character except \n
[xyz] either x, y or z
[^bz] any character, except b and z
[a-z] any character between a and z
[^a-z] any character, except those between a and z
R* zero R or more; R can be any regular expression
R one R or more
R! one or zero R "that is an optiona# R$
R%&,'( & to ' R
R%&,( & R or more
R%&( exact#y & R
%)*+,*)( expansion o- )*+,*), that as been de-ined abo.e in the
-i#e
\/ 012,, / character
\3&4 the caracter which 012,, code is 3&4, in octal
\x&0 the caracter which 012,, code is &0, in hexadecimal
R1 R -o##owed by 1
R51 R or 1
R61 R, on#y i- -o##owed by 1
^R R, on#y at the be7innin7 o- a #ine
R8 R, on#y at the end o- a #ine
99:*;<< end o- -i#e

%strutura
/egunda parte do arquio lex' regras de traduo
( 0lgumas especificao pode ser estrita nesta parte
do arquio entre +, -+ %sta especificao ser*
colocada no inicio da funo 11lex23! que a funo
que recon$ece os tokens e retorna um n4mero
inteiro
( regras de traduo tem a sintaxe exp_regular
ao7 se a ao no for especificada o token
recon$ecido ser* utili5ado. /e a ao tier mais de
uma instruo ou for utili5ada mais de uma lin$a!
dee estar entre , -.

6oment*rios
Lin$as de coment*rios podem acontecer na
segunda parte do arquio na sesso de a#es
entre 77 78 87.
0 ari*el 88text arma5ena os tokens
recon$ecidos pelas express#es regulares.
%sta ari*el e composta de uma tabela de
caractere com o comprimento arma5enado
na ari*el 88leng.

%strutura
9erceira parte do arquio lex' procedimentos auxiliares
( 0qui ser* inserido cdigo de programao
necess*rio para suprir suas necessidades de
programao. /e nada for inserido o lex
considerar* o cdigo abaixo'
main()
{
yylex();
}
6ompilar'

%{
int nline9
%}
%%
ciro print12"&n :iro ;eneses <antos"49
. print12"&n 5rro= entrada > %s "788text49
&n { ((nline9 print12"&n ?o@a linha"49 }
%%
int main24 {
88lex249
print12"&n0im de programa de %d linha "7nline 49
}
%xerccio lex ex:.l

%{
int i,qt =0; int vetor[10];
%}
digit [0-9]
%%
{digit}+ { if( insere(atoi(yytext)) )
printf(!n "#$%&' &()ero );
e*se printf(!n+#,% -./0 overf*o1 );}
%%
int )ain() {
yy*ex();
for(i=0; i2 10; i++)
printf(!n3te) [4d] = 4d ,i,vetor[i]);
printf(!n5i) de progra)a );
}
int insere(int x) {
if( qt 2 10 ){
vetor[qt] = x; qt++; ret(rn(1);
}
e*se
ret(rn (0); }
%xerccio lex ex;.l

Yacc
Yacc: o 1acc um gerador de analisador
sint*tico L0L< para =L6. O 1acc recebe
um texto com a descrio de uma
gram*tica com a#es sem>nticas e gera
um recon$ecedor sint*tico
correspondente.

%strutura
Um programa 8acc dividido em trs
partes, separadas pelos smbolos %%
declaraes
%%
regras de traduo
%%
procedimentos auxiliares

%strutura
&rimeira parte do arquio 1acc' declara#es
( )a seo de declara#es so feitas as declara#es
de ari*eis defini#es e inclus#es de arquios
entre +, -+
( ?eclara#es dos tokens utili5ados pelo 1acc
%toAen Ae8$ord
( 9erminal que utili5a %union
( &rioridades de operadores
( <egra para iniciali5ao %start

%strutura
/egunda parte do arquio 1acc' regras da gram*tica
( &rodu#es das regras da linguagem'
nonterminal_notion = bod8_, { semantical_action_, }
3 bod8_B { semantical_action_B }
3 ... { ... }
3 bod8_n { semantical_action_n }
9

%strutura
9erceira parte do arquio 1acc' procedimentos auxiliares
C
#include "lex.88.cD onde est* definida a
funo 88lex24.
( 0qui ser* inserido cdigo de programao
necess*rio para suprir suas necessidades de
programao. ?ee incluir a funo main23 que dee
c$amar 88parse24 e 88error24
6ompilar'

%xerccio lex & 1acc ex@.l
! expeci1icacao 214lex para subconEunto Fascal !
%{
6in7*(de y8ta98:
%}
3- [;-<a-=][;-<a-=0-9]>
%%
9egin { ret(rn t?%@3&; }
end { ret(rn t%&-; }
'= { ret(rn t;AA3@&; }
{3-} { ret(rn t3-%&"353%,; }
[0-9]+ { ret(rn t&./?%,; }
[ !n!t] B> ignora expa7os e) 9ran7o >B
8 { ret(rn >yytext; }
%%

! expeci1icacao 284acc para subconEunto Fascal !
%{
6in7*(de 2stdio8:C
%}
4toDen t?%@3&
4toDen t%&-
4toDen t;AA3@&
4toDen t3-%&"353%,
4toDen t&./?%,
4*eft E+E
4*eft E-E
4start ini7io
%xerccio lex & 1acc ex@.1

%%
state)ent ' t3-%&"353%, t;AA3@& expression
F ;
ini7io ' t?%@3& stt t%&- ;
stt ' state)ent E8E
F state)ent E;E stt ;
expression ' t&./?%,
F t3-%&"353%,
F expression E+E expression
F expression E-E expression
;
44
int )ain () {
yyparse(); }
int yyerror(7:ar >s) {
fprintf(stderr, 4s!n,s); }
6in7*(de *ex8yy87
%xerccio grammer ex@.1

! expeci1icacao 214lex para subconEunto Fascal !
%{
#include "8.tab.h"
%}
GH %)#*a#+'%)#*a#+-#.'!
%%
"integer" { return tG?I5J5"9 }
"@ar" { return tK)"9 }
"program" { return tF"LJ");9 }
"then" { return tIM5?9 }
"i1" { return tG09 }
"begin" { return tN5JG?9 }
"end" { return t5?H9 }
"=>" { return t)<<GJ?9 }
{GH} { return tGH9 }
%-#.'( { return t?O;9 }
% &n&t' ! ignora expacos em branco !
. { return !88text9 }
%%
%xerccio lex & 1acc exA.l

! expeci1icacao 284acc para subconEunto Fascal !
%{
#include <stdio.h>
%}
%toAen tF"LJ");
%toAen tK)"
%toAen tG?I5J5"
%toAen tIM5?
%toAen tG0
%toAen tN5JG?
%toAen t5?H
%toAen t)<<GJ?
%toAen tGH
%toAen t?O;
%le1t P(P
%le1t P#P
%start inicio
%xerccio lex & 1acc exA.1

%xerccio grammer ex@.1
%%
ini7io ' t0,#@,;/ t3- ; 9*o7oGar 9*o7o0rin7ipa* ;
9*o7oGar ' tG;, 9*o7o3d ' t3&"%@%, ; F ;
9*o7o3d ' t3- F 9*o7o3d E,E t3- ;
9*o7o0rin7ipa* ' t?%@3& 9*o7o+orpo t%&- ;
9*o7o+orpo ' 7o)ando F 9*o7o+orpo 7o)ando F ;
7o)ando ' 9*o7o35 F 9*o7oAt ;
9*o7o35 ' if F 9*o7o35 if ;
if ' t35 ( 9*o7o+ond ) t"H%& t?%@3& 9*o7oAt t%&- ;
9*o7oAt ' state)ent F 9*o7oAt ; state)ent ;
9*o7o+ond ' ident 7ondi7ao ident ;
ident ' t&./ F t3- ;
7ondi7ao ' C F 2 ;
state)ent ' t3- t;AA3@& expression F ;
expression ' t&./ F t3-F expression E+E expression ;
44
6in7*(de *ex8yy87
int )ain () {
yyparse(); }
int yyerror(7:ar >s) {
fprintf(stderr,4s %,,#' Iin:a 4d "#$%&' 4s !n,s,yy*ineno,yytext);
}

Você também pode gostar