使用 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 的输入,以获取包含您的修改的令牌流。
为 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 的输入,以获取包含您的修改的令牌流。