Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tfguitar

Analisador Lexico

Recommended Posts

Olá pessoal,Estou precisando montar um analisador lexico, e me passaram o lex e o yacc pra desenvolver, mas não tenho nem idéia de como começar....Alguem poderia me dar uma idéia, ou dizer um tutorial ?valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Manual do Flex

Site do Flex

 

Um exemplo do uso do flex (bem besta):

%{	int numeroDeLinhas = 0;	int numeroDeCaracteres = 0;	int inteiros = 0;%}DIGITO	[0-9]%%{DIGITO}+	{numeroDeCaracteres++; inteiros++;}\n		{numeroDeLinhas++; numeroDeCaracteres++;}.		{numeroDeCaracteres++;}%%/* programa principal */int main() {  yylex(); /* scanner gerado por Flex */  printf("Numero de Linhas = %d\n", numeroDeLinhas);  printf("Numero de Caracteres = %d\n", numeroDeCaracteres);  printf("Numero de Inteiros = %d\n", inteiros);  return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

skimo-color:tou dando uma olhada no seu código, fiz um aki beleza...aew na hora de compilar executei flex <nomeprograma>.lex, aew me gerou um codigo lex.yy.c ....E o que eu faço dps ??????????valew....

Compartilhar este post


Link para o post
Compartilhar em outros sites

flex PROGRAMA.lgcc -o EXECUTAVEL lex.yy.c -lfl
Aí vai criar o executável.

 

Obs:

Para compilar no flex você pode colocar a opção -o para escolher o nome do arquivo de saída, ao invés de lex.yy.c.

Também é aconselhável utilizar a opção -i para Case Insensitive

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aew eu de novo :( , mas tá dolorido....peguei esse código de exemplo do manual da flex e na hora de compilar dá esse erro...

"teste.l", line 48: premature EOF

e não foi só nesse exemplo mas em vários outros.....o que está havendo.....Segue código....
%{	 #include <math.h>	 %}	 	 DIGIT	[0-9]	 ID	   [a-z][a-z0-9]*	 	 %%	 	 {DIGIT}+	{				 printf( "An integer: %s (%d)\n", yytext,						 atoi( yytext ) );				 }	 	 {DIGIT}+"."{DIGIT}*		{				 printf( "A float: %s (%g)\n", yytext,						 atof( yytext ) );				 }	 	 if|then|begin|end|procedure|function		{				 printf( "A keyword: %s\n", yytext );				 }	 	 {ID}		printf( "An identifier: %s\n", yytext );	 	 "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );	 	 "{"[^}\n]*"}"	 /* eat up one-line comments */	 	 [ \t\n]+		  /* eat up whitespace */	 	 .		   printf( "Unrecognized character: %s\n", yytext );	 	 %%	 	 main( argc, argv )	 int argc;	 char **argv;		 {		 ++argv, --argc;  /* skip over program name */		 if ( argc > 0 )				 yyin = fopen( argv[0], "r" );		 else				 yyin = stdin;	 		 yylex();		 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Experimente remover os espaços nas declarações. Elas devem estar no começo da linha:

%{	 #include <math.h>%}   DIGIT	[0-9]ID	   [a-z][a-z0-9]*	%%	{DIGIT}+	{				 printf( "An integer: %s (%d)\n", yytext,						 atoi( yytext ) );				 }	{DIGIT}+"."{DIGIT}*		{				 printf( "A float: %s (%g)\n", yytext,						 atof( yytext ) );				 }	if|then|begin|end|procedure|function		{				 printf( "A keyword: %s\n", yytext );				 }	{ID}		printf( "An identifier: %s\n", yytext );	"+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );	"{"[^}\n]*"}"	 /* eat up one-line comments */   [ \t\n]+		  /* eat up whitespace */	.		   printf( "Unrecognized character: %s\n", yytext );	%%/* resto do código */

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.