1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
/* Generated by re2c */
#line 1 "config9.b.re"
#include <cstring>
#include <iostream>
struct Scanner
{
Scanner(char *txt)
: cur(txt), lim(txt + strlen(txt))
{
}
char *cur;
char *lim;
char *ptr;
char *ctx;
char *tok;
};
enum What
{
UNEXPECTED,
KEYWORD,
NUMBER,
EOI
};
char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" };
void fill(int)
{
}
int scan(Scanner &s)
{
char *cursor = s.cur;
if(cursor == s.lim)
return EOI;
std:
s.tok = cursor;
#line 46 "config9.b.c"
{
unsigned char curr;
static const unsigned char yybm[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
if ((s.lim - s.cur) < 3) fill(3);
curr = (unsigned char)*s.cur;
if (yybm[0+curr] & 128) {
goto xx6;
}
if (curr <= 0x1F) {
if (curr <= 0x08) goto xx2;
if (curr <= '\n') goto xx4;
} else {
if (curr <= ' ') goto xx4;
if (curr <= '`') goto xx2;
if (curr <= 'b') goto xx9;
}
xx2:
++s.cur;
xx3:
#line 68 "config9.b.re"
{
return UNEXPECTED;
}
#line 103 "config9.b.c"
xx4:
++s.cur;
#line 61 "config9.b.re"
{
if(s.cur == s.lim)
return EOI;
cursor = s.cur;
goto std;
}
#line 113 "config9.b.c"
xx6:
++s.cur;
if (s.lim <= s.cur) fill(1);
curr = (unsigned char)*s.cur;
if (yybm[0+curr] & 128) {
goto xx6;
}
#line 58 "config9.b.re"
{ return NUMBER; }
#line 123 "config9.b.c"
xx9:
curr = (unsigned char)*++s.cur;
if (curr <= '/') goto xx3;
if (curr == '1') {
s.ctx = s.cur;
goto xx13;
}
if (curr >= ':') goto xx3;
s.ctx = s.cur;
xx10:
++s.cur;
if (s.lim <= s.cur) fill(1);
curr = (unsigned char)*s.cur;
if (curr <= '/') goto xx12;
if (curr <= '9') goto xx10;
xx12:
s.cur = s.ctx;
#line 57 "config9.b.re"
{ return KEYWORD; }
#line 143 "config9.b.c"
xx13:
curr = (unsigned char)*++s.cur;
if (curr <= '/') goto xx14;
if (curr <= '9') goto xx10;
xx14:
s.cur -= 1;
#line 56 "config9.b.re"
{ return KEYWORD; }
#line 152 "config9.b.c"
}
#line 71 "config9.b.re"
}
int main(int,char**)
{
Scanner s("a77 a1 b8 b1");
int t, n = 0;
while ((t = scan(s)) != EOI)
{
std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl;
}
}
|