Blame


1 8ad51794 2004-03-25 devnull %{
2 8ad51794 2004-03-25 devnull #include "grep.h"
3 8ad51794 2004-03-25 devnull %}
4 8ad51794 2004-03-25 devnull
5 8ad51794 2004-03-25 devnull %union
6 8ad51794 2004-03-25 devnull {
7 8ad51794 2004-03-25 devnull int val;
8 8ad51794 2004-03-25 devnull char* str;
9 8ad51794 2004-03-25 devnull Re2 re;
10 8ad51794 2004-03-25 devnull }
11 8ad51794 2004-03-25 devnull
12 8ad51794 2004-03-25 devnull %type <re> expr prog
13 8ad51794 2004-03-25 devnull %type <re> expr0 expr1 expr2 expr3 expr4
14 8ad51794 2004-03-25 devnull %token <str> LCLASS
15 8ad51794 2004-03-25 devnull %token <val> LCHAR
16 8ad51794 2004-03-25 devnull %token LLPAREN LRPAREN LALT LSTAR LPLUS LQUES
17 8ad51794 2004-03-25 devnull %token LBEGIN LEND LDOT LBAD LNEWLINE
18 8ad51794 2004-03-25 devnull %%
19 8ad51794 2004-03-25 devnull
20 8ad51794 2004-03-25 devnull prog:
21 8ad51794 2004-03-25 devnull expr newlines
22 8ad51794 2004-03-25 devnull {
23 8ad51794 2004-03-25 devnull $$.beg = ral(Tend);
24 8ad51794 2004-03-25 devnull $$.end = $$.beg;
25 8ad51794 2004-03-25 devnull $$ = re2cat(re2star(re2or(re2char(0x00, '\n'-1), re2char('\n'+1, 0xff))), $$);
26 8ad51794 2004-03-25 devnull $$ = re2cat($1, $$);
27 8ad51794 2004-03-25 devnull $$ = re2cat(re2star(re2char(0x00, 0xff)), $$);
28 8ad51794 2004-03-25 devnull topre = $$;
29 8ad51794 2004-03-25 devnull }
30 8ad51794 2004-03-25 devnull
31 8ad51794 2004-03-25 devnull expr:
32 8ad51794 2004-03-25 devnull expr0
33 8ad51794 2004-03-25 devnull | expr newlines expr0
34 8ad51794 2004-03-25 devnull {
35 8ad51794 2004-03-25 devnull $$ = re2or($1, $3);
36 8ad51794 2004-03-25 devnull }
37 8ad51794 2004-03-25 devnull
38 8ad51794 2004-03-25 devnull expr0:
39 8ad51794 2004-03-25 devnull expr1
40 8ad51794 2004-03-25 devnull | LSTAR { literal = 1; } expr1
41 8ad51794 2004-03-25 devnull {
42 8ad51794 2004-03-25 devnull $$ = $3;
43 8ad51794 2004-03-25 devnull }
44 8ad51794 2004-03-25 devnull
45 8ad51794 2004-03-25 devnull expr1:
46 8ad51794 2004-03-25 devnull expr2
47 8ad51794 2004-03-25 devnull | expr1 LALT expr2
48 8ad51794 2004-03-25 devnull {
49 8ad51794 2004-03-25 devnull $$ = re2or($1, $3);
50 8ad51794 2004-03-25 devnull }
51 8ad51794 2004-03-25 devnull
52 8ad51794 2004-03-25 devnull expr2:
53 8ad51794 2004-03-25 devnull expr3
54 8ad51794 2004-03-25 devnull | expr2 expr3
55 8ad51794 2004-03-25 devnull {
56 8ad51794 2004-03-25 devnull $$ = re2cat($1, $2);
57 8ad51794 2004-03-25 devnull }
58 8ad51794 2004-03-25 devnull
59 8ad51794 2004-03-25 devnull expr3:
60 8ad51794 2004-03-25 devnull expr4
61 8ad51794 2004-03-25 devnull | expr3 LSTAR
62 8ad51794 2004-03-25 devnull {
63 8ad51794 2004-03-25 devnull $$ = re2star($1);
64 8ad51794 2004-03-25 devnull }
65 8ad51794 2004-03-25 devnull | expr3 LPLUS
66 8ad51794 2004-03-25 devnull {
67 8ad51794 2004-03-25 devnull $$.beg = ral(Talt);
68 8ad51794 2004-03-25 devnull patchnext($1.end, $$.beg);
69 285b4f85 2004-03-25 devnull $$.beg->u.alt = $1.beg;
70 8ad51794 2004-03-25 devnull $$.end = $$.beg;
71 8ad51794 2004-03-25 devnull $$.beg = $1.beg;
72 8ad51794 2004-03-25 devnull }
73 8ad51794 2004-03-25 devnull | expr3 LQUES
74 8ad51794 2004-03-25 devnull {
75 8ad51794 2004-03-25 devnull $$.beg = ral(Talt);
76 285b4f85 2004-03-25 devnull $$.beg->u.alt = $1.beg;
77 8ad51794 2004-03-25 devnull $$.end = $1.end;
78 8ad51794 2004-03-25 devnull appendnext($$.end, $$.beg);
79 8ad51794 2004-03-25 devnull }
80 8ad51794 2004-03-25 devnull
81 8ad51794 2004-03-25 devnull expr4:
82 8ad51794 2004-03-25 devnull LCHAR
83 8ad51794 2004-03-25 devnull {
84 8ad51794 2004-03-25 devnull $$.beg = ral(Tclass);
85 285b4f85 2004-03-25 devnull $$.beg->u.x.lo = $1;
86 285b4f85 2004-03-25 devnull $$.beg->u.x.hi = $1;
87 8ad51794 2004-03-25 devnull $$.end = $$.beg;
88 8ad51794 2004-03-25 devnull }
89 8ad51794 2004-03-25 devnull | LBEGIN
90 8ad51794 2004-03-25 devnull {
91 8ad51794 2004-03-25 devnull $$.beg = ral(Tbegin);
92 8ad51794 2004-03-25 devnull $$.end = $$.beg;
93 8ad51794 2004-03-25 devnull }
94 8ad51794 2004-03-25 devnull | LEND
95 8ad51794 2004-03-25 devnull {
96 8ad51794 2004-03-25 devnull $$.beg = ral(Tend);
97 8ad51794 2004-03-25 devnull $$.end = $$.beg;
98 8ad51794 2004-03-25 devnull }
99 8ad51794 2004-03-25 devnull | LDOT
100 8ad51794 2004-03-25 devnull {
101 8ad51794 2004-03-25 devnull $$ = re2class("^\n");
102 8ad51794 2004-03-25 devnull }
103 8ad51794 2004-03-25 devnull | LCLASS
104 8ad51794 2004-03-25 devnull {
105 8ad51794 2004-03-25 devnull $$ = re2class($1);
106 8ad51794 2004-03-25 devnull }
107 8ad51794 2004-03-25 devnull | LLPAREN expr1 LRPAREN
108 8ad51794 2004-03-25 devnull {
109 8ad51794 2004-03-25 devnull $$ = $2;
110 8ad51794 2004-03-25 devnull }
111 8ad51794 2004-03-25 devnull
112 8ad51794 2004-03-25 devnull newlines:
113 8ad51794 2004-03-25 devnull LNEWLINE
114 8ad51794 2004-03-25 devnull | newlines LNEWLINE
115 8ad51794 2004-03-25 devnull %%
116 8ad51794 2004-03-25 devnull
117 8ad51794 2004-03-25 devnull void
118 8ad51794 2004-03-25 devnull yyerror(char *e, ...)
119 8ad51794 2004-03-25 devnull {
120 8ad51794 2004-03-25 devnull if(filename)
121 8ad51794 2004-03-25 devnull fprint(2, "grep: %s:%ld: %s\n", filename, lineno, e);
122 8ad51794 2004-03-25 devnull else
123 8ad51794 2004-03-25 devnull fprint(2, "grep: %s\n", e);
124 8ad51794 2004-03-25 devnull exits("syntax");
125 8ad51794 2004-03-25 devnull }
126 8ad51794 2004-03-25 devnull
127 be22ae2d 2004-03-26 devnull int
128 8ad51794 2004-03-25 devnull yylex(void)
129 8ad51794 2004-03-25 devnull {
130 8ad51794 2004-03-25 devnull char *q, *eq;
131 8ad51794 2004-03-25 devnull int c, s;
132 8ad51794 2004-03-25 devnull
133 8ad51794 2004-03-25 devnull if(peekc) {
134 8ad51794 2004-03-25 devnull s = peekc;
135 8ad51794 2004-03-25 devnull peekc = 0;
136 8ad51794 2004-03-25 devnull return s;
137 8ad51794 2004-03-25 devnull }
138 8ad51794 2004-03-25 devnull c = getrec();
139 8ad51794 2004-03-25 devnull if(literal) {
140 8ad51794 2004-03-25 devnull if(c != 0 && c != '\n') {
141 8ad51794 2004-03-25 devnull yylval.val = c;
142 8ad51794 2004-03-25 devnull return LCHAR;
143 8ad51794 2004-03-25 devnull }
144 8ad51794 2004-03-25 devnull literal = 0;
145 8ad51794 2004-03-25 devnull }
146 8ad51794 2004-03-25 devnull switch(c) {
147 8ad51794 2004-03-25 devnull default:
148 8ad51794 2004-03-25 devnull yylval.val = c;
149 8ad51794 2004-03-25 devnull s = LCHAR;
150 8ad51794 2004-03-25 devnull break;
151 8ad51794 2004-03-25 devnull case '\\':
152 8ad51794 2004-03-25 devnull c = getrec();
153 8ad51794 2004-03-25 devnull yylval.val = c;
154 8ad51794 2004-03-25 devnull s = LCHAR;
155 8ad51794 2004-03-25 devnull if(c == '\n')
156 8ad51794 2004-03-25 devnull s = LNEWLINE;
157 8ad51794 2004-03-25 devnull break;
158 8ad51794 2004-03-25 devnull case '[':
159 8ad51794 2004-03-25 devnull goto getclass;
160 8ad51794 2004-03-25 devnull case '(':
161 8ad51794 2004-03-25 devnull s = LLPAREN;
162 8ad51794 2004-03-25 devnull break;
163 8ad51794 2004-03-25 devnull case ')':
164 8ad51794 2004-03-25 devnull s = LRPAREN;
165 8ad51794 2004-03-25 devnull break;
166 8ad51794 2004-03-25 devnull case '|':
167 8ad51794 2004-03-25 devnull s = LALT;
168 8ad51794 2004-03-25 devnull break;
169 8ad51794 2004-03-25 devnull case '*':
170 8ad51794 2004-03-25 devnull s = LSTAR;
171 8ad51794 2004-03-25 devnull break;
172 8ad51794 2004-03-25 devnull case '+':
173 8ad51794 2004-03-25 devnull s = LPLUS;
174 8ad51794 2004-03-25 devnull break;
175 8ad51794 2004-03-25 devnull case '?':
176 8ad51794 2004-03-25 devnull s = LQUES;
177 8ad51794 2004-03-25 devnull break;
178 8ad51794 2004-03-25 devnull case '^':
179 8ad51794 2004-03-25 devnull s = LBEGIN;
180 8ad51794 2004-03-25 devnull break;
181 8ad51794 2004-03-25 devnull case '$':
182 8ad51794 2004-03-25 devnull s = LEND;
183 8ad51794 2004-03-25 devnull break;
184 8ad51794 2004-03-25 devnull case '.':
185 8ad51794 2004-03-25 devnull s = LDOT;
186 8ad51794 2004-03-25 devnull break;
187 8ad51794 2004-03-25 devnull case 0:
188 8ad51794 2004-03-25 devnull peekc = -1;
189 8ad51794 2004-03-25 devnull case '\n':
190 8ad51794 2004-03-25 devnull s = LNEWLINE;
191 8ad51794 2004-03-25 devnull break;
192 8ad51794 2004-03-25 devnull }
193 8ad51794 2004-03-25 devnull return s;
194 8ad51794 2004-03-25 devnull
195 8ad51794 2004-03-25 devnull getclass:
196 8ad51794 2004-03-25 devnull q = u.string;
197 8ad51794 2004-03-25 devnull eq = q + nelem(u.string) - 5;
198 8ad51794 2004-03-25 devnull c = getrec();
199 8ad51794 2004-03-25 devnull if(c == '^') {
200 8ad51794 2004-03-25 devnull q[0] = '^';
201 8ad51794 2004-03-25 devnull q[1] = '\n';
202 8ad51794 2004-03-25 devnull q[2] = '-';
203 8ad51794 2004-03-25 devnull q[3] = '\n';
204 8ad51794 2004-03-25 devnull q += 4;
205 8ad51794 2004-03-25 devnull c = getrec();
206 8ad51794 2004-03-25 devnull }
207 8ad51794 2004-03-25 devnull for(;;) {
208 8ad51794 2004-03-25 devnull if(q >= eq)
209 8ad51794 2004-03-25 devnull error("class too long");
210 8ad51794 2004-03-25 devnull if(c == ']' || c == 0)
211 8ad51794 2004-03-25 devnull break;
212 8ad51794 2004-03-25 devnull if(c == '\\') {
213 8ad51794 2004-03-25 devnull *q++ = c;
214 8ad51794 2004-03-25 devnull c = getrec();
215 8ad51794 2004-03-25 devnull if(c == 0)
216 8ad51794 2004-03-25 devnull break;
217 8ad51794 2004-03-25 devnull }
218 8ad51794 2004-03-25 devnull *q++ = c;
219 8ad51794 2004-03-25 devnull c = getrec();
220 8ad51794 2004-03-25 devnull }
221 8ad51794 2004-03-25 devnull *q = 0;
222 8ad51794 2004-03-25 devnull if(c == 0)
223 8ad51794 2004-03-25 devnull return LBAD;
224 8ad51794 2004-03-25 devnull yylval.str = u.string;
225 8ad51794 2004-03-25 devnull return LCLASS;
226 8ad51794 2004-03-25 devnull }