8000 Unhandled `TOK_ERROR` for incompletely parsed unsupported backtracking control flags · Issue #386 · katef/libfsm · GitHub
[go: up one dir, main page]

Skip to content

Unhandled TOK_ERROR for incompletely parsed unsupported backtracking control flags #386

Open

Description


C41C
@silentbicycle

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.

Activity

  1. silentbicycle commented on Oct 20, 2022

    @silentbicycle
    CollaboratorAuthor

    Similarly, the intermediate steps for other multi-character tokens with .., will trigger the same assert -- (*C (for (*CR), (*P, (*pos, (?<, and so on. A catch-all error hander for TOK_ERROR should address all of these.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      0