]> granicus.if.org Git - re2c/commitdiff
Give a concise error message when EOF rule is present, but no other rules are.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 7 Mar 2019 22:51:11 +0000 (22:51 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 7 Mar 2019 22:51:11 +0000 (22:51 +0000)
src/nfa/estimate_size.cc
src/parse/validate.cc
test/eof/eof_05.c [new file with mode: 0644]
test/eof/eof_05.re [new file with mode: 0644]

index 7a28784b7cfed90ecaa9478d372e9c5eb384fe14..45109f5b71dafb3771e2e3c3fe0d7cb8e2c9b735 100644 (file)
@@ -36,6 +36,7 @@ static size_t estimate(const RE *re)
 size_t estimate_size(const std::vector<RE*> &res)
 {
     const size_t nre = res.size();
+    DASSERT(nre > 0);
     size_t size = nre - 1;
     for (size_t i = 0; i < nre; ++i) {
         size += estimate(res[i]) + 1;
index 56a541b362d4c39f7b7ecb345a2e3d68d0a4cc5a..e1a566c48c887f8160eba1de0242d9ea1a363b21 100644 (file)
@@ -64,6 +64,11 @@ void validate_ast(const specs_t &specs, const opt_t *opts, Msg &msg)
                 "EOF rule %sis already defined at line %u",
                 incond(i->name).c_str(), i->eofs[0]->loc.line);
         }
+        else if (i->rules.empty() && i->defs.empty() && !i->eofs.empty()) {
+            msg.fatal(i->eofs[0]->loc,
+                "EOF rule %swithout other rules doesn't make sense",
+                incond(i->name).c_str());
+        }
     }
 
     if (!opts->cFlag) {
diff --git a/test/eof/eof_05.c b/test/eof/eof_05.c
new file mode 100644 (file)
index 0000000..bf11947
--- /dev/null
@@ -0,0 +1 @@
+eof/eof_05.re:3:6: error: EOF rule without other rules doesn't make sense
diff --git a/test/eof/eof_05.re b/test/eof/eof_05.re
new file mode 100644 (file)
index 0000000..245d2cd
--- /dev/null
@@ -0,0 +1,4 @@
+/*!re2c
+    re2c:eof = 0;
+    $ {}
+*/