使用 TokenStreamRewriter 在词法分析之后但在解析之前插入标记

Using TokenStreamRewriter to insert tokens after lexing but before parsing

为 C++ 使用 ANTLR 4.9.2。

根据第一个标记,我可能需要在解析之前插入一些标记。我的方法(简化)

    antlr4::ANTLRInputStream antlrIs(properlyEscaped);
    Lexer lexer(&antlrIs);
    antlr4::CommonTokenStream tokens(&lexer);
    antlr4::TokenStreamRewriter tokenStreamRewriter(&tokens);

    if (!(tokens.LA(1) == Lexer::MY_SPECIAL_TOKEN))
    {
        tokenStreamRewriter.insertBefore(tokens.LT(1), string("begin"));
    }

    Parser parser(&tokens);
    Parser::FileContext* fileContext = parser.file();

单步执行调试器,我看到令牌已实际插入。但是我插入的新令牌似乎被 parser.file().

忽略了

如何插入标记以便 parser.file() 使用它们?

TokenStreamRewriter 只是建立了一组关于如何更改输入流的指令。它实际上并没有改变令牌流本身。

执行完所有修改调用后,您需要调用 .getText()(或 .getText(String programName))以获取包含所有更改的字符串。然后,您可以将其用作 Lexer 的输入,以获取包含您的修改的令牌流。