static char *sccsid
= "@(#)egrep.y 4.2 (Berkeley) 11/8/82";
char gotofn
[NSTATES
][NCHARS
];
#define yyclearin yychar = -1
#define yyerrok yyerrflag = 0
fprintf(stderr
, "egrep: %s\n", s
);
case '?': return (QUEST
);
if ((c
= nextch()) == '^') {
if (c
== '\0') synerror();
if (c
== '-' && cclcnt
> 0 && chars
[nxtchar
-1] != 0) {
if ((d
= nextch()) != 0) {
if (nxtchar
>= MAXLIN
) overflo();
if (nxtchar
>= MAXLIN
) overflo();
} while ((c
= nextch()) != ']');
if ((c
= nextch()) == '\0') synerror();
default: yylval
= c
; return (CHAR
);
if ((c
= getc(exprfile
)) == EOF
) {
fprintf(stderr
, "egrep: syntax error\n");
if(line
>= MAXLIN
) overflo();
if(line
>= MAXLIN
) overflo();
if(line
>= MAXLIN
) overflo();
fprintf(stderr
, "egrep: regular expression too long\n");
for (i
=1; i
<=line
; i
++) tmpstat
[i
] = 0;
else if (right
[v
] == 0) cfoll(left
[v
]);
for (n
=3; n
<=line
; n
++) tmpstat
[n
] = 0;
for (n
=3; n
<=line
; n
++) initstat
[n
] = tmpstat
[n
];
count
--; /*leave out position 1 */
if (out
[s
] == 1) continue;
for (i
=0; i
<NCHARS
; i
++) symbol
[i
] = 0;
num
= positions
[state
[s
]];
for (i
=3; i
<=line
; i
++) tmpstat
[i
] = initstat
[i
];
if ((c
= name
[curpos
]) >= 0) {
if (c
< NCHARS
) symbol
[c
] = 1;
if (k
!='\n') symbol
[k
] = 1;
nc
= chars
[right
[curpos
]];
for (k
=0; k
<nc
; k
++) symbol
[chars
[pc
++]] = 1;
nc
= chars
[right
[curpos
]];
for (j
= 0; j
< NCHARS
; j
++) {
if (j
==chars
[pc
++]) goto cont
;
if (j
!='\n') symbol
[j
] = 1;
else printf("something's funny\n");
for (c
=0; c
<NCHARS
; c
++) {
if (symbol
[c
] == 1) { /* nextstate(s,c) */
for (i
=3; i
<= line
; i
++) tmpstat
[i
] = initstat
[i
];
if ((k
= name
[curpos
]) >= 0)
| (k
== CCL
&& member(c
, right
[curpos
], 1))
| (k
== NCCL
&& member(c
, right
[curpos
], 0))
number
= positions
[foll
[curpos
]];
newpos
= foll
[curpos
] + 1;
for (k
=0; k
<number
; k
++) {
if (tmpstat
[positions
[newpos
]] != 1) {
tmpstat
[positions
[newpos
]] = 1;
if (n
>= NSTATES
) overflo();
if (tmpstat
[line
] == 1) out
[n
] = 1;
else if (right
[v
] == 0) {
if (cstate(left
[v
]) == 0) return (0);
else if (name
[v
] == PLUS
) return (1);
else if (name
[v
] == CAT
) {
if (cstate(left
[v
]) == 0 && cstate(right
[v
]) == 0) return (0);
else { /* name[v] == OR */
if (cstate(left
[v
]) == 0 || b
== 0) return (0);
member(symb
, set
, torf
) {
if (symb
== chars
[pos
++]) return (torf
);
if (positions
[state
[i
]] == count
) {
for (j
=0; j
< count
; j
++)
if (tmpstat
[positions
[pos
++]] != 1) goto nxt
;
add(array
, n
) int *array
; {
if (nxtpos
+ count
> MAXPOS
) overflo();
positions
[nxtpos
++] = count
;
for (i
=3; i
<= line
; i
++) {
case CAT
: if (v
== left
[p
]) {
if (cstate(right
[p
]) == 0) {
case FINAL
: if (tmpstat
[line
] != 1) {
while (--argc
> 0 && (++argv
)[0][0]=='-')
fprintf(stderr
, "egrep: unknown flag\n");
exprfile
= fopen(fname
, "r");
if (exprfile
== (FILE *)NULL
) {
fprintf(stderr
, "egrep: can't open %s\n", fname
);
else while (--argc
>= 0) {
if ((f
= open(file
, 0)) < 0) {
fprintf(stderr
, "egrep: can't open %s\n", file
);
if ((ccount
= read(f
,p
,512))<=0) goto done
;
istat
= cstat
= gotofn
[0]['\n'];
if (out
[cstat
]) goto found
;
cstat
= gotofn
[cstat
][*p
&0377]; /* all input chars made positive */
if (nfile
> 1 && hflag
) printf("%s:", file
);
if (bflag
) printf("%d:", blkno
);
if (nflag
) printf("%ld:", lnum
);
while (nlp
< &buf
[1024]) putchar(*nlp
++);
while (nlp
< p
) putchar(*nlp
++);
if ((out
[(cstat
=istat
)]) == 0) goto brk2
;
if ((ccount
= read(f
, p
, 512)) <= 0) goto done
;
else if (p
== &buf
[1024]) {
if ((ccount
= read(f
, p
, 512)) <= 0) goto done
;
if ((ccount
= read(f
, p
, &buf
[1024]-p
)) <= 0) goto done
;
if (out
[(cstat
=istat
)]) goto cfound
;
if ((ccount
= read(f
, p
, 512)) <= 0) break;
else if (p
== &buf
[1024]) {
if ((ccount
= read(f
, p
, 512)) <= 0) break;
if ((ccount
= read(f
, p
, &buf
[1024] - p
)) <= 0) break;
10, 22, 4, 14, 11, 2, 1, 5, 0, 0,
10, 15, 16, 17, 18, 0, 19, 20, 3, 0,
10, 0, 0, 12, 0, 20, 0, 20, 0, 0,
10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10, 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, 11, 6, 7, 8,
9, 21, 0, 15, 16, 17, 11, 6, 7, 8,
9, 23, 0, 15, 16, 17, 11, 6, 7, 8,
9, 13, 0, 15, 16, 17, 11, 6, 7, 8,
9, 0, 0, 15, 16, 17, 11, 6, 7, 8,
-259,-1000,-1000, 0,-1000, -20,-1000,-1000,-1000,-1000,
0,-1000, 0, 0,-252,-1000,-1000,-1000, -40, -30,
0, 1, 2, 2, 2, 2, 3, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4 };
0, 1, 2, 4, 3, 3, 0, 1, 1, 1,
1, 3, 2, 2, 2, 2, 3, 1 };
-1000, -1, -2, -3, 261, -4, 257, 258, 259, 260,
40, 256, -3, 261, -4, 263, 264, 265, -4, -4,
6, -2, 1, 0, 6, 2, 7, 8, 9, 10,
0, 17, 0, 5, 12, 13, 14, 15, 0, 4,
# define YYERROR goto yyerrlab
# define YYACCEPT return(0)
# define YYABORT return(1)
/* parser for yacc output */
int yydebug
= 0; /* 1 for debugging */
YYSTYPE yyv
[YYMAXDEPTH
]; /* where the values are stored */
int yychar
= -1; /* current input token number */
int yynerrs
= 0; /* number of errors */
short yyerrflag
= 0; /* error recovery flag */
register short yystate
, *yyps
, yyn
;
yystack
: /* put a state and value onto the stack */
if( yydebug
) printf( "state %d, char 0%o\n", yystate
, yychar
);
if( ++yyps
> &yys
[YYMAXDEPTH
] ) { yyerror( "yacc stack overflow" ); return(1); }
if( yyn
<= YYFLAG
) goto yydefault
; /* simple state */
if( yychar
<0 ) if( (yychar
=yylex())<0 ) yychar
=0;
if( (yyn
+= yychar
)<0 || yyn
>= YYLAST
) goto yydefault
;
if( yychk
[ yyn
=yyact
[ yyn
] ] == yychar
){ /* valid shift */
if( yyerrflag
> 0 ) --yyerrflag
;
/* default state action */
if( (yyn
=yydef
[yystate
]) == -2 ) {
if( yychar
<0 ) if( (yychar
=yylex())<0 ) yychar
= 0;
/* look through exception table */
for( yyxi
=yyexca
; (*yyxi
!= (-1)) || (yyxi
[1]!=yystate
) ; yyxi
+= 2 ) ; /* VOID */
while( *(yyxi
+=2) >= 0 ){
if( *yyxi
== yychar
) break;
if( (yyn
= yyxi
[1]) < 0 ) return(0); /* accept */
if( yyn
== 0 ){ /* error */
/* error ... attempt to resume parsing */
case 0: /* brand new error */
yyerror( "syntax error" );
case 2: /* incompletely recovered error ... try again */
/* find a state where "error" is a legal shift action */
yyn
= yypact
[*yyps
] + YYERRCODE
;
if( yyn
>= 0 && yyn
< YYLAST
&& yychk
[yyact
[yyn
]] == YYERRCODE
){
yystate
= yyact
[yyn
]; /* simulate a shift of "error" */
/* the current yyps has no shift onn "error", pop stack */
if( yydebug
) printf( "error recovery pops state %d, uncovers %d\n", *yyps
, yyps
[-1] );
/* there is no state on the stack with an error shift ... abort */
case 3: /* no shift yet; clobber input char */
if( yydebug
) printf( "error recovery discards char %d\n", yychar
);
if( yychar
== 0 ) goto yyabort
; /* don't discard EOF, quit */
goto yynewstate
; /* try again in the same state */
/* reduction by production yyn */
if( yydebug
) printf("reduce %d\n",yyn
);
/* consult goto table to find next state */
yyj
= yypgo
[yyn
] + *yyps
+ 1;
if( yyj
>=YYLAST
|| yychk
[ yystate
= yyact
[yyj
] ] != -yyn
) yystate
= yyact
[yypgo
[yyn
]];
{ unary(FINAL
, yypvt
[-0]);
{ yyval
= node(CAT
, yypvt
[-1], yypvt
[-0]); } break;
{ yyval
= node(CAT
, yypvt
[-2], yypvt
[-1]); } break;
{ yyval
= node(CAT
, yypvt
[-1], yypvt
[-0]); } break;
{ yyval
= node(CAT
, yypvt
[-2], yypvt
[-1]); } break;
yyval
= unary(STAR
, yyval
); } break;
{ yyval
= enter(yypvt
[-0]); } break;
{ yyval
= enter(DOT
); } break;
{ yyval
= cclenter(CCL
); } break;
{ yyval
= cclenter(NCCL
); } break;
{ yyval
= node(OR
, yypvt
[-2], yypvt
[-0]); } break;
{ yyval
= node(CAT
, yypvt
[-1], yypvt
[-0]); } break;
{ yyval
= unary(STAR
, yypvt
[-1]); } break;
{ yyval
= unary(PLUS
, yypvt
[-1]); } break;
{ yyval
= unary(QUEST
, yypvt
[-1]); } break;
{ yyval
= yypvt
[-1]; } break;
goto yystack
; /* stack new state and value */