• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Red_Beret

Lex (-Yacc) ?? O que é?

15 mensagens neste tópico

o lex (flex) é um gerador de analizadores léxicos.

permite-te gerar código em C que depois de comilado pode ser usado para percorrer um texto e sempre que aparecerem determinadas expressões (regulares) nesse texto efectuar uma determinada operação.

o yacc (bison) é um gerador de parsers.

tal como o lex, permite gerar código C que depois de compilado pode ser usado para fazer parsing de um ficheiro. a vantagem do yacc é que não está limitado a expressões regulares, permite também o uso de gramáticas (independetes do contexto). normalmente é usado em conjunto com o lex.

podes obter mais informações no seguintes links:

http://www.di.uminho.pt/~gepl/LP/CompilerGenerators.html

http://www.di.uminho.pt/~prh/pl105f01resDCC.pdf

http://www.di.uminho.pt/~prh/pl105f02resDCC.pdf

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, tks

Já agora, alguem me sabe dizer como usar isto em Linux? (comandos para gerar o lex.yy.c e comandos para depois compilar o mesmo e usá-lo)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lex file.l -> gera o ficheiro 'lex.yy.c'

gcc lex.yy.c -> gera o ficheiro executável 'a.out' (admitindo que o ficheiro 'file.l' contém a função 'main')

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

chama-se lextest (a extensão não sei, mas é a default dos ficheiros de texto criados com o editor de texto do fedora)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo o que se vê na screenshot o teu ficheiro não tem extensão, logo claro que não encontra o lextest.l.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok, ja consegui.

agora, como executo o a.out? (de modo a este fazer a analise de um ficheiro de texto)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em princípio precisas de fazer

./a.out < texto.txt

isto porque por omissão o ficheiro de input é o stdin, embora possas alterar isso para leres de um ficheiro específico.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tks, ja agora, ao fazer o lex file.l, ha algum comando que faça com que o ficheiro de saida tenha outro nome? (em vez de se chamar lex.yy.c, ter um nome  a nossa escolha)

e para que serve a função yyin() ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tks, ja agora, ao fazer o lex file.l, ha algum comando que faça com que o ficheiro de saida tenha outro nome? (em vez de se chamar lex.yy.c, ter um nome  a nossa escolha)

tens a opção '-o', o seguinte comando gera o ficheiro 'file.c'

lex -ofile.c file.l

atenção que, pelo menos na versão que eu tenho, não pode existir espaços entre o '-o' e o 'file.c'

e para que serve a função yyin() ?

a função 'yyin()' serve para alterar o ficheiro de input (que por omissão é o stdin). eu normalmente defino a 'main' desta forma:

int main(int argc,char* argv[])
{
  if(argc>0) yyin=fopen(argv[1],"r");
  else yyin=stdin;

  yylex();

  return 0;
}

ou seja, se eu passar um argumento à 'main' vai ser feito o parsing do ficheiro com esse nome, caso contrário será feito o parsing do stdin.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum... tou a ver.  tks.

Ja agora, desculpem la estar a ser chato, mas um aultima questão (ou não)

Encontrei este código na net

%{
#include <stdio.h>
%}
%option noyywrap
%%
[0-9]+  {printf("Saw an integer: %s\n", yytext); }
.       {   }

%%
int main(void)
{
     yylex();
    return 0;
}

Neste caso, para que é que serve o %option noyywrap ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

essa opção serve para indicar que tu não definiste a função 'yywrap'.

PS: a função 'yywrap' diz ao lex o que é que ele deve fazer quando chegar a um EndOfFile (quando isto acontecer é executada essa função e se esta devolver o valor 0 ele fica a espera de mais input, caso contrário o parsing termina).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora