diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2020-01-01 22:47:29 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2020-01-24 11:16:31 +0200 |
commit | a3e9e8285e825e8d49570d9564b88b726dd30c2a (patch) | |
tree | a63bedb6d34fb4c64c2a18558afc07e429fe9209 | |
parent | 4d9b12969eaa9770fecda1f90b465939675ce5d0 (diff) | |
download | one-true-awk-a3e9e8285e825e8d49570d9564b88b726dd30c2a.tar.gz |
Fix for a{0} bug.
-rw-r--r-- | awkgram.y | 2 | ||||
-rw-r--r-- | b.c | 12 |
2 files changed, 12 insertions, 2 deletions
@@ -50,7 +50,7 @@ Node *arglist = 0; /* list of args for current function */ %token <i> NL ',' '{' '(' '|' ';' '/' ')' '}' '[' ']' %token <i> ARRAY %token <i> MATCH NOTMATCH MATCHOP -%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE +%token <i> FINAL DOT ALL CCL NCCL CHAR OR STAR QUEST PLUS EMPTYRE ZERO %token <i> AND BOR APPEND EQ GE GT LE LT NE IN %token <i> ARG BLTIN BREAK CLOSE CONTINUE DELETE DO EXIT FOR FUNC %token <i> SUB GSUB IF INDEX LSUBSTR MATCHFCN NEXT NEXTFILE @@ -263,6 +263,8 @@ void penter(Node *p) /* set up parent pointers and leaf indices */ parent(left(p)) = p; parent(right(p)) = p; break; + case ZERO: + break; default: /* can't happen */ FATAL("can't happen: unknown type %d in penter", type(p)); break; @@ -277,6 +279,7 @@ void freetr(Node *p) /* free parse tree */ xfree(p); break; UNARY + case ZERO: freetr(left(p)); xfree(p); break; @@ -436,6 +439,8 @@ void cfoll(fa *f, Node *v) /* enter follow set of each leaf of vertex v into lfo cfoll(f,left(v)); cfoll(f,right(v)); break; + case ZERO: + break; default: /* can't happen */ FATAL("can't happen: unknown type %d in cfoll", type(v)); } @@ -479,6 +484,8 @@ int first(Node *p) /* collects initially active leaves of p into setvec */ b = first(right(p)); if (first(left(p)) == 0 || b == 0) return(0); return(1); + case ZERO: + return 0; } FATAL("can't happen: unknown type %d in first", type(p)); /* can't happen */ return(-1); @@ -838,6 +845,9 @@ Node *unary(Node *np) case QUEST: rtok = relex(); return (unary(op2(QUEST, np, NIL))); + case ZERO: + rtok = relex(); + return (unary(op2(ZERO, np, NIL))); default: return (np); } @@ -1191,7 +1201,7 @@ rescan: if (repeat(starttok, prestr-starttok, lastatom, startreptok - lastatom, n, m) > 0) { if (n == 0 && m == 0) { - return EMPTYRE; + return ZERO; } /* must rescan input for next token */ goto rescan; |