Annotation of researchv9/cmd/egrep/gram.y, revision 1.1.1.1

1.1       root        1: /*
                      2:  * egrep -- print lines containing (or not containing) a regular expression
                      3:  *
                      4:  *     status returns:
                      5:  *             0 - ok, and some matches
                      6:  *             1 - ok, but no matches
                      7:  *             2 - some error; matches irrelevant
                      8:  */
                      9: %token CHAR DOT CCL NCCL OR CAT STAR PLUS QUEST
                     10: %left OR
                     11: %left CHAR DOT CCL NCCL '('
                     12: %left CAT
                     13: %left STAR PLUS QUEST
                     14: 
                     15: %{
                     16: #include "hdr.h"
                     17: %}
                     18: 
                     19: %%
                     20: s:     t
                     21:                { unary(FINAL, $1);
                     22:                  line--;
                     23:                }
                     24:        ;
                     25: t:     b r
                     26:                { $$ = node(CAT, $1, $2); }
                     27:        | OR b r OR
                     28:                { $$ = node(CAT, $2, $3); }
                     29:        | OR b r
                     30:                { $$ = node(CAT, $2, $3); }
                     31:        | b r OR
                     32:                { $$ = node(CAT, $1, $2); }
                     33:        ;
                     34: b:
                     35:                { $$ = enter(DOT);
                     36:                   $$ = unary(STAR, $$); }
                     37:        ;
                     38: r:     CHAR
                     39:                { $$ = iflag?node(OR, enter(tolower($1)), enter(toupper($1))):enter($1); }
                     40:        | DOT
                     41:                { $$ = enter(DOT); }
                     42:        | CCL
                     43:                { $$ = cclenter(CCL); }
                     44:        | NCCL
                     45:                { $$ = cclenter(NCCL); }
                     46:        ;
                     47: 
                     48: r:     r OR r
                     49:                { $$ = node(OR, $1, $3); }
                     50:        | r r %prec CAT
                     51:                { $$ = node(CAT, $1, $2); }
                     52:        | r STAR
                     53:                { $$ = unary(STAR, $1); }
                     54:        | r PLUS
                     55:                { $$ = unary(PLUS, $1); }
                     56:        | r QUEST
                     57:                { $$ = unary(QUEST, $1); }
                     58:        | '(' r ')'
                     59:                { $$ = $2; }
                     60:        | error 
                     61:        ;
                     62: 
                     63: %%
                     64: yyerror(s) {
                     65:        fprint(2, "egrep: %s\n", s);
                     66:        exit(2);
                     67: }
                     68: 
                     69: yylex() {
                     70:        extern int yylval;
                     71:        int cclcnt, x;
                     72:        register char c, d;
                     73:        switch(c = nextch()) {
                     74:                case '^': c = LEFT;
                     75:                        goto defchar;
                     76:                case '$': c = RIGHT;
                     77:                        goto defchar;
                     78:                case '|': return (OR);
                     79:                case '*': return (STAR);
                     80:                case '+': return (PLUS);
                     81:                case '?': return (QUEST);
                     82:                case '(': return (c);
                     83:                case ')': return (c);
                     84:                case '.': return (DOT);
                     85:                case '\0': return (0);
                     86:                case RIGHT: return (OR);
                     87:                case '[': 
                     88:                        x = CCL;
                     89:                        cclcnt = 0;
                     90:                        count = nxtchar++;
                     91:                        if ((c = nextch()) == '^') {
                     92:                                x = NCCL;
                     93:                                c = nextch();
                     94:                        }
                     95:                        do {
                     96:                                if (c == '\0') synerror();
                     97:                                if (c == '-' && cclcnt > 0 && chars[nxtchar-1] != 0) {
                     98:                                        if ((d = nextch()) != 0) {
                     99:                                                c = chars[nxtchar-1];
                    100:                                                while (c < d) {
                    101:                                                        if (iflag && isalpha(c)) {
                    102:                                                                if (nxtchar >= MAXLIN-1) overflo();
                    103:                                                                        chars[nxtchar++] = isupper(++c)?tolower(c):toupper(c);
                    104:                                                                        chars[nxtchar++] = c;
                    105:                                                                        cclcnt += 2;
                    106:                                                        }
                    107:                                                        else {
                    108:                                                                if (nxtchar >= MAXLIN) overflo();
                    109:                                                                chars[nxtchar++] = ++c;
                    110:                                                                cclcnt++;
                    111:                                                        }
                    112:                                                }
                    113:                                                continue;
                    114:                                        }
                    115:                                }
                    116:                                if (iflag&&isalpha(c)) {
                    117:                                        if (nxtchar >= MAXLIN-1) overflo();
                    118:                                        chars[nxtchar++] = isupper(c)?tolower(c):toupper(c);
                    119:                                        chars[nxtchar++] = c;
                    120:                                        cclcnt += 2;
                    121:                                }
                    122:                                else {
                    123:                                        if (nxtchar >= MAXLIN) overflo();
                    124:                                        chars[nxtchar++] = c;
                    125:                                        cclcnt++;
                    126:                                }
                    127:                        } while ((c = nextch()) != ']');
                    128:                        chars[count] = cclcnt;
                    129:                        return (x);
                    130:                case '\\':
                    131:                        if ((c = nextch()) == '\0') synerror();
                    132:                        else if (c == '\n') c = nextch();
                    133:                defchar:
                    134:                default: yylval = c; return (CHAR);
                    135:        }
                    136: }
                    137: 
                    138: static int mailfd = -1;
                    139: 
                    140: nextch() {
                    141:        register c;
                    142:        if (fflag) {
                    143:                if ((c = Fgetc(expfile)) < 0)
                    144:                        c = 0;
                    145:        }
                    146:        else c = *input++;
                    147: if(mailfd >= 0) Fputc(mailfd, c? c : '\n');
                    148:        return(c);
                    149: }
                    150: 
                    151: synerror() {
                    152:        fprint(2, "egrep: syntax error\n");
                    153:        exit(2);
                    154: }
                    155: 
                    156: enter(x) int x; {
                    157:        if(line >= MAXLIN) overflo();
                    158:        name[line] = x;
                    159:        left[line] = 0;
                    160:        right[line] = 0;
                    161:        return(line++);
                    162: }
                    163: 
                    164: cclenter(x) int x; {
                    165:        register linno;
                    166:        linno = enter(x);
                    167:        right[linno] = count;
                    168:        return (linno);
                    169: }
                    170: 
                    171: node(x, l, r) {
                    172:        if(line >= MAXLIN) overflo();
                    173:        name[line] = x;
                    174:        left[line] = l;
                    175:        right[line] = r;
                    176:        parent[l] = line;
                    177:        parent[r] = line;
                    178:        return(line++);
                    179: }
                    180: 
                    181: unary(x, d) {
                    182:        if(line >= MAXLIN) overflo();
                    183:        name[line] = x;
                    184:        left[line] = d;
                    185:        right[line] = 0;
                    186:        parent[d] = line;
                    187:        return(line++);
                    188: }
                    189: overflo() {
                    190:        fprint(2, "egrep: regular expression too long\n");
                    191:        exit(2);
                    192: }
                    193: #include       <errno.h>
                    194: #define                NAME            "/tmp/grepdata"
                    195: mailprep()
                    196: {
                    197:        umask(0);
                    198:        mailfd = open(NAME, 1);
                    199:        if((mailfd < 0) && (errno != ECONC))
                    200:                mailfd = creat(NAME, 03666);
                    201:        if(mailfd >= 0){
                    202:                Finit(mailfd, (char *)0);
                    203:                Fseek(mailfd, 0L, 2);
                    204:                Fprint(mailfd, "\321egrep: ");
                    205:        }
                    206: }
                    207: 
                    208: maildone()
                    209: {
                    210:        if(mailfd >= 0){
                    211:                Fflush(mailfd);
                    212:                close(mailfd);
                    213:        }
                    214: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.