Jump to content

Recommended Posts

Posted

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

  • 1 month later...
Posted

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() ?

Posted

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.

Posted

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 ?

Posted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.