Simples exemplo de uso do re2c

Para quem não conhece, o re2c é um tool para escrever rápidos e flexíveis scanners. Um adepto desse tool não tão recentemente, é o PHP em sua versão 5.3, vindo assim a substituir o velho Flex, o qual já demostrei em posts anteriores envolvendo parsers. Em questão de atualizações, o re2c vem se mantendo mais ativo, visto que o Flex não atualiza desde fevereiro de 2008.

A forma de utilização do re2c é diferente do Flex, vendo o código abaixo percebemos que as declarações ficam dentro de uma espécie de comentário, que no fim de tudo tornar-se-á naquele conhecido código cheio de GOTOs. Enfim, veja como é simples!

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
/* Tipo da entrada */
#define YYCTYPE char
 
/* L-expression do tipo *YYCTYPE que apontará para o símbolo atual */
#define YYCURSOR (s->start)
 
/* Expressão do tipo *YYCTYPE que aponta para o fim do buffer */
#define YYLIMIT (s->end)
 
typedef struct _scanner_state {
	char *start, *end, *data;
} scanner_state;
 
/* Tokens */
#define T_EOF		-1
#define T_ERROR 	0
#define T_INTEGER	1
#define T_SPACE		2
#define T_COLON		3
#define T_COMMA		4
#define T_STRING	5
 
#define SET_DATA \
	s->data = strndup(start, YYCURSOR - start);
 
int scan(scanner_state *s)
{
	char *start = s->start;
/*!re2c
	re2c:yyfill:enable = 0;
 
	INTEGER = [0-9]+;
	SPACE 	= [\r\n\t ]+;
	STRING	= [a-zA-Z]+;
 
 
	INTEGER { SET_DATA; return T_INTEGER;}
	STRING  { SET_DATA; return T_STRING; }
	SPACE   { return T_SPACE;   }
	":"     { return T_COLON;   }
	","     { return T_COMMA;   }
	"\000"  { return T_EOF;     }
	[^]     { return T_ERROR;   }
*/
}
 
int main(int argc, char **argv)
{
	int token;
	scanner_state state;
 
	state.start = "1 foo, 2:"; /* Entrada */
 
	while ((token = scan(&state)) > 0) {
		switch (token) {
			case T_INTEGER:
				printf("Inteiro: %s\n", state.data);
				free(state.data);
				break;
			case T_STRING:
				printf("String: %s\n", state.data);
				free(state.data);
				break;
			case T_SPACE:
				printf("Espaço\n");
				break;
			case T_COMMA:
				printf("Vírgula\n");
				break;
			case T_COLON:
				printf("Dois pontos\n");
				break;
		}
	}
 
	return 0;
}

Testando...

$ re2c -o scanner.c scanner.re ; gcc -o scan scanner.c
$ ./scan 
Inteiro: 1
Espaço
String: foo
Vírgula
Espaço
Inteiro: 2
Dois pontos

Mais informações em: http://re2c.sourceforge.net/manual.html

Parabens ecl , show de bola

Parabens ecl , show de bola seu post
Detono deve ser o unico material em PT sobre o mesmo xD

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options