-
-
Notifications
You must be signed in to change notification settings - Fork 58
Description
The PCRE dialect's lexer and parser hit an assertion with the input (*::
$ build/bin/re -rpcre '(*:'
re: src/libre/parser.act:1108: struct ast *parse_re_pcre(re_getchar_fun *, void *, const struct fsm_options *, enum re_flags, int, struct re_err *): Assertion `!"unreached"' failed.
This appears to be because the lexer expects a ) to close the backtracking control flags, but if the '(*' .. ')' {} in lx does not get the closing ')' it just returns TOK_ERROR, and the parser does not have a catch-all error handler at the right layer -- the very first thing the generated parser's point of entry does is return if the current terminal is the error token. This misses the other error handlers, so the assertion that if parsing did not produce an expression, an error code is set fails shortly after.
I spent a bit trying to flag the error properly in the parser, but I'm not that familiar with sid. Adding a TOK_ERROR check in parser.act between ADVANCE_LEXER; and DIALECT_ENTRY catches it, but seems hacky. There also doesn't seem to be a clearly appropriate error code -- RE_EXSUB ("expected sub-expression") may be the closest.