1// re2c $INPUT -o $OUTPUT -s
2#include <cstring>
3#include <iostream>
4
5struct Scanner
6{
7	Scanner(char *txt)
8		: cur(txt), lim(txt + strlen(txt))
9	{
10	}
11
12	char    *cur;
13	char    *lim;
14	char	*ptr;
15	char	*ctx;
16	char    *tok;
17};
18
19#define	YYCTYPE		char
20#define	YYCURSOR	s.cur
21#define	YYLIMIT		s.lim
22#define	YYMARKER	s.ptr
23#define	YYCTXMARKER	s.ctx
24#define	YYFILL(n)
25
26enum What
27{
28	UNEXPECTED,
29	KEYWORD,
30	NUMBER,
31	EOI
32};
33
34char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" };
35
36
37int scan(Scanner &s)
38{
39	YYCTYPE *cursor = s.cur;
40
41	if(cursor == s.lim)
42		return EOI;
43
44std:
45	s.tok = cursor;
46
47/*!re2c
48
49("a"|"b")/[1]    { return KEYWORD; }
50("a"|"b")/[0-9]+ { return KEYWORD; }
51[0-9]+           { return NUMBER;  }
52
53[ \t\n]
54	{
55		if(s.cur == s.lim)
56			return EOI;
57		cursor = s.cur;
58		goto std;
59	}
60.
61	{
62		return UNEXPECTED;
63	}
64*/
65}
66
67/*!max:re2c */
68
69int main(int,char**)
70{
71	Scanner s("a77 a1 b8 b1");
72
73	int t, n = 0;
74	while ((t = scan(s)) != EOI)
75	{
76		std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl;
77	}
78}
79