2 8ad51794 2004-03-25 devnull #include "grep.h"
8 8ad51794 2004-03-25 devnull char* str;
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
21 8ad51794 2004-03-25 devnull expr newlines
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 = $$;
33 8ad51794 2004-03-25 devnull | expr newlines expr0
35 8ad51794 2004-03-25 devnull $$ = re2or($1, $3);
40 8ad51794 2004-03-25 devnull | LSTAR { literal = 1; } expr1
47 8ad51794 2004-03-25 devnull | expr1 LALT expr2
49 8ad51794 2004-03-25 devnull $$ = re2or($1, $3);
54 8ad51794 2004-03-25 devnull | expr2 expr3
56 8ad51794 2004-03-25 devnull $$ = re2cat($1, $2);
61 8ad51794 2004-03-25 devnull | expr3 LSTAR
63 8ad51794 2004-03-25 devnull $$ = re2star($1);
65 8ad51794 2004-03-25 devnull | expr3 LPLUS
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;
73 8ad51794 2004-03-25 devnull | expr3 LQUES
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);
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;
91 8ad51794 2004-03-25 devnull $$.beg = ral(Tbegin);
92 8ad51794 2004-03-25 devnull $$.end = $$.beg;
96 8ad51794 2004-03-25 devnull $$.beg = ral(Tend);
97 8ad51794 2004-03-25 devnull $$.end = $$.beg;
101 8ad51794 2004-03-25 devnull $$ = re2class("^\n");
103 8ad51794 2004-03-25 devnull | LCLASS
105 8ad51794 2004-03-25 devnull $$ = re2class($1);
107 8ad51794 2004-03-25 devnull | LLPAREN expr1 LRPAREN
109 8ad51794 2004-03-25 devnull $$ = $2;
112 8ad51794 2004-03-25 devnull newlines:
113 8ad51794 2004-03-25 devnull LNEWLINE
114 8ad51794 2004-03-25 devnull | newlines LNEWLINE
118 8ad51794 2004-03-25 devnull yyerror(char *e, ...)
120 8ad51794 2004-03-25 devnull if(filename)
121 8ad51794 2004-03-25 devnull fprint(2, "grep: %s:%ld: %s\n", filename, lineno, e);
123 8ad51794 2004-03-25 devnull fprint(2, "grep: %s\n", e);
124 8ad51794 2004-03-25 devnull exits("syntax");
128 8ad51794 2004-03-25 devnull yylex(void)
130 8ad51794 2004-03-25 devnull char *q, *eq;
131 8ad51794 2004-03-25 devnull int c, s;
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;
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;
144 8ad51794 2004-03-25 devnull literal = 0;
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;
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;
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;
163 8ad51794 2004-03-25 devnull case ')':
164 8ad51794 2004-03-25 devnull s = LRPAREN;
166 8ad51794 2004-03-25 devnull case '|':
167 8ad51794 2004-03-25 devnull s = LALT;
169 8ad51794 2004-03-25 devnull case '*':
170 8ad51794 2004-03-25 devnull s = LSTAR;
172 8ad51794 2004-03-25 devnull case '+':
173 8ad51794 2004-03-25 devnull s = LPLUS;
175 8ad51794 2004-03-25 devnull case '?':
176 8ad51794 2004-03-25 devnull s = LQUES;
178 8ad51794 2004-03-25 devnull case '^':
179 8ad51794 2004-03-25 devnull s = LBEGIN;
181 8ad51794 2004-03-25 devnull case '$':
182 8ad51794 2004-03-25 devnull s = LEND;
184 8ad51794 2004-03-25 devnull case '.':
185 8ad51794 2004-03-25 devnull s = LDOT;
188 8ad51794 2004-03-25 devnull peekc = -1;
189 8ad51794 2004-03-25 devnull case '\n':
190 8ad51794 2004-03-25 devnull s = LNEWLINE;
193 8ad51794 2004-03-25 devnull return s;
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';
205 8ad51794 2004-03-25 devnull c = getrec();
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)
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)
218 8ad51794 2004-03-25 devnull *q++ = c;
219 8ad51794 2004-03-25 devnull c = getrec();
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;