1 /* Generated by re2c */
2 #line 1 "ctx.re"
3 // re2c $INPUT -o $OUTPUT
4 #include <cstring>
5 #include <iostream>
6 
7 struct Scanner
8 {
ScannerScanner9 	Scanner(char *txt)
10 		: cur(txt), lim(txt + strlen(txt))
11 	{
12 	}
13 
14 	char    *cur;
15 	char    *lim;
16 	char	*ptr;
17 	char	*ctx;
18 	char    *tok;
19 };
20 
21 #define	YYCTYPE		char
22 #define	YYCURSOR	s.cur
23 #define	YYLIMIT		s.lim
24 #define	YYMARKER	s.ptr
25 #define	YYCTXMARKER	s.ctx
26 #define	YYFILL(n)
27 
28 enum What
29 {
30 	UNEXPECTED,
31 	KEYWORD,
32 	NUMBER,
33 	EOI
34 };
35 
36 char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" };
37 
38 
scan(Scanner & s)39 int scan(Scanner &s)
40 {
41 	YYCTYPE *cursor = s.cur;
42 
43 	if(cursor == s.lim)
44 		return EOI;
45 
46 std:
47 	s.tok = cursor;
48 
49 
50 #line 51 "ctx.c"
51 {
52 	YYCTYPE yych;
53 	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
54 	yych = *YYCURSOR;
55 	switch (yych) {
56 	case '\t':
57 	case '\n':
58 	case ' ':	goto yy4;
59 	case '0':
60 	case '1':
61 	case '2':
62 	case '3':
63 	case '4':
64 	case '5':
65 	case '6':
66 	case '7':
67 	case '8':
68 	case '9':	goto yy6;
69 	case 'a':
70 	case 'b':	goto yy9;
71 	default:	goto yy2;
72 	}
73 yy2:
74 	++YYCURSOR;
75 yy3:
76 #line 61 "ctx.re"
77 	{
78 		return UNEXPECTED;
79 	}
80 #line 81 "ctx.c"
81 yy4:
82 	++YYCURSOR;
83 #line 54 "ctx.re"
84 	{
85 		if(s.cur == s.lim)
86 			return EOI;
87 		cursor = s.cur;
88 		goto std;
89 	}
90 #line 91 "ctx.c"
91 yy6:
92 	++YYCURSOR;
93 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
94 	yych = *YYCURSOR;
95 	switch (yych) {
96 	case '0':
97 	case '1':
98 	case '2':
99 	case '3':
100 	case '4':
101 	case '5':
102 	case '6':
103 	case '7':
104 	case '8':
105 	case '9':	goto yy6;
106 	default:	goto yy8;
107 	}
108 yy8:
109 #line 51 "ctx.re"
110 	{ return NUMBER;  }
111 #line 112 "ctx.c"
112 yy9:
113 	yych = *++YYCURSOR;
114 	switch (yych) {
115 	case '0':
116 	case '2':
117 	case '3':
118 	case '4':
119 	case '5':
120 	case '6':
121 	case '7':
122 	case '8':
123 	case '9':
124 		YYCTXMARKER = YYCURSOR;
125 		goto yy10;
126 	case '1':
127 		YYCTXMARKER = YYCURSOR;
128 		goto yy13;
129 	default:	goto yy3;
130 	}
131 yy10:
132 	++YYCURSOR;
133 	if (YYLIMIT <= YYCURSOR) YYFILL(1);
134 	yych = *YYCURSOR;
135 	switch (yych) {
136 	case '0':
137 	case '1':
138 	case '2':
139 	case '3':
140 	case '4':
141 	case '5':
142 	case '6':
143 	case '7':
144 	case '8':
145 	case '9':	goto yy10;
146 	default:	goto yy12;
147 	}
148 yy12:
149 	YYCURSOR = YYCTXMARKER;
150 #line 50 "ctx.re"
151 	{ return KEYWORD; }
152 #line 153 "ctx.c"
153 yy13:
154 	yych = *++YYCURSOR;
155 	switch (yych) {
156 	case '0':
157 	case '1':
158 	case '2':
159 	case '3':
160 	case '4':
161 	case '5':
162 	case '6':
163 	case '7':
164 	case '8':
165 	case '9':	goto yy10;
166 	default:	goto yy14;
167 	}
168 yy14:
169 	YYCURSOR -= 1;
170 #line 49 "ctx.re"
171 	{ return KEYWORD; }
172 #line 173 "ctx.c"
173 }
174 #line 64 "ctx.re"
175 
176 }
177 
178 #line 179 "ctx.c"
179 #define YYMAXFILL 3
180 #line 67 "ctx.re"
181 
182 
main(int,char **)183 int main(int,char**)
184 {
185 	Scanner s("a77 a1 b8 b1");
186 
187 	int t, n = 0;
188 	while ((t = scan(s)) != EOI)
189 	{
190 		std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl;
191 	}
192 }
193