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