]> granicus.if.org Git - re2c/commitdiff
Fixed EOF rule handling in case when EOF symbol is the upper bound of charset.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 6 Mar 2019 14:54:00 +0000 (14:54 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 6 Mar 2019 14:54:00 +0000 (14:54 +0000)
re2c/src/codegen/go_construct.cc

index 38b7a38022a4838a621cf3397b669c1642fcfa3d..a328b792fdcfece6c164c652b5600f331ddc254e 100644 (file)
@@ -271,24 +271,28 @@ void Go::init(const State *from, const opt_t *opts, bitmaps_t &bitmaps)
         }
     }
 
+    // only do EOF check in states that dispatch on symbol
+    const uint32_t eof = from->go.nSpans == 1 && !consume(from->go.span[0].to)
+        ? NOEOF : opts->eof;
+
     const uint32_t dSpans = nSpans - hSpans - nBitmaps;
     const bool part_skip = opts->eager_skip && !skip;
     if (opts->target == TARGET_DOT) {
         type = DOT;
-        info.dot = new Dot (span, nSpans, from, opts->eof);
+        info.dot = new Dot (span, nSpans, from, eof);
     }
     else if (opts->gFlag && !part_skip && (dSpans >= opts->cGotoThreshold) && !low_spans_have_tags) {
         type = CPGOTO;
-        info.cpgoto = new Cpgoto (span, nSpans, hspan, hSpans, from->next, opts->sFlag, opts->eof);
+        info.cpgoto = new Cpgoto (span, nSpans, hspan, hSpans, from->next, opts->sFlag, eof);
     }
     else if (opts->bFlag && !part_skip && (nBitmaps > 0)) {
         type = BITMAP;
-        info.bitmap = new GoBitmap (span, nSpans, hspan, hSpans, bm, bms, from->next, opts->sFlag, opts->eof);
+        info.bitmap = new GoBitmap (span, nSpans, hspan, hSpans, bm, bms, from->next, opts->sFlag, eof);
         bitmaps.used = true;
     }
     else {
         type = SWITCH_IF;
-        info.switchif = new SwitchIf (span, nSpans, from->next, opts->sFlag, part_skip, opts->eof);
+        info.switchif = new SwitchIf (span, nSpans, from->next, opts->sFlag, part_skip, eof);
     }
 }