Red_Beret Posted October 21, 2006 at 10:57 AM Report #59012 Posted October 21, 2006 at 10:57 AM Ppl, alguem me sabe explicar o que é o Lex?
Rui Carlos Posted October 21, 2006 at 11:07 AM Report #59014 Posted October 21, 2006 at 11:07 AM 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 Rui Carlos Gonçalves
Red_Beret Posted December 3, 2006 at 02:20 PM Author Report #68454 Posted December 3, 2006 at 02:20 PM 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)
Rui Carlos Posted December 3, 2006 at 02:35 PM Report #68456 Posted December 3, 2006 at 02:35 PM 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') Rui Carlos Gonçalves
Red_Beret Posted December 3, 2006 at 03:26 PM Author Report #68462 Posted December 3, 2006 at 03:26 PM não dá. dá sempre erro...
Rui Carlos Posted December 3, 2006 at 04:00 PM Report #68464 Posted December 3, 2006 at 04:00 PM o ficheiro chama-se 'lextest' ou 'lextest.l'? Rui Carlos Gonçalves
Red_Beret Posted December 3, 2006 at 04:06 PM Author Report #68466 Posted December 3, 2006 at 04:06 PM chama-se lextest (a extensão não sei, mas é a default dos ficheiros de texto criados com o editor de texto do fedora)
Triton Posted December 3, 2006 at 04:13 PM Report #68469 Posted December 3, 2006 at 04:13 PM Pelo o que se vê na screenshot o teu ficheiro não tem extensão, logo claro que não encontra o lextest.l. <3 life
Red_Beret Posted December 3, 2006 at 04:17 PM Author Report #68470 Posted December 3, 2006 at 04:17 PM mas mesmo pondo lá o .l (no ficheiro) da o mesmo erro
Red_Beret Posted December 3, 2006 at 04:47 PM Author Report #68472 Posted December 3, 2006 at 04:47 PM ok, ja consegui. agora, como executo o a.out? (de modo a este fazer a analise de um ficheiro de texto)
Rui Carlos Posted December 3, 2006 at 04:52 PM Report #68474 Posted December 3, 2006 at 04:52 PM 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. Rui Carlos Gonçalves
Red_Beret Posted December 4, 2006 at 06:18 PM Author Report #68718 Posted December 4, 2006 at 06:18 PM 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() ?
Rui Carlos Posted December 4, 2006 at 07:54 PM Report #68763 Posted December 4, 2006 at 07:54 PM 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. Rui Carlos Gonçalves
Red_Beret Posted December 5, 2006 at 11:24 AM Author Report #68866 Posted December 5, 2006 at 11:24 AM 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 ?
Rui Carlos Posted December 5, 2006 at 04:37 PM Report #68932 Posted December 5, 2006 at 04:37 PM 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). Rui Carlos Gonçalves
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now