Antlr4 切换CommonTokenStream以忽略或启用空白

Antlr4 切换CommonTokenStream以忽略或启用空白,antlr4,Antlr4,我的原始语法使用skip命令在解析过程中忽略空格 WS : [ \t]+ -> skip ; 但是,对于重构方法,我需要将空白标记发送到隐藏通道,以便根据以下receipe使用TokenStreamRewriter: 现在的问题是,解析器将空白识别为标记,我希望在默认解析过程中避免这种情况 是否可以根据常规解析过程或重构方法(使用相同语法)的解析过程在同一规则的两个不同实现之间切换 我需要语义谓词吗?或者CommonTokenStream中是否有一种方法可以跳过或启用W

我的原始语法使用skip命令在解析过程中忽略空格

WS      :   [ \t]+ ->  skip ;
但是,对于重构方法,我需要将空白标记发送到隐藏通道,以便根据以下receipe使用TokenStreamRewriter:

现在的问题是,解析器将空白识别为标记,我希望在默认解析过程中避免这种情况

是否可以根据常规解析过程或重构方法(使用相同语法)的解析过程在同一规则的两个不同实现之间切换


我需要语义谓词吗?或者CommonTokenStream中是否有一种方法可以跳过或启用WhitePacces?

我不确定是什么导致了您的问题。你预期的行为是正确的

WS[\t]+->频道(隐藏)

将这些令牌移动到解析器未处理的通道。您不需要语义谓词或对CommonTokenStream的任何特殊调用来实现这一点

这就是我在语法中所做的,解析器看不到WS(我有一个稍微不同的WS规则,但没有什么区别)

lexer(又名标记器)独立于解析器运行(在解析器之前),因此解析器不能做任何事情来影响lexer的工作方式(例如,标记放置在哪个通道上)

您可能还希望查看令牌流上的以下方法:

public List<Token> getTokens(int start, int stop, int ttype)
public List getTokens(int start、int stop、int ttype)

使用该方法,您可以通过提供注释标记的标记类型作为第三个参数,从开始和停止标记索引中提取注释标记的列表。

您好,迈克,谢谢您的回答。目前,我跳过了空白,这使我能够检测函数、变量等,以便进行源代码分析。这个很好用。但是,当我想使用TokenStreamRewriter(语法中有空格跳过)时,我没有得到我需要的空格,例如,提取解析和替换源代码。因此,在重构过程中,我需要lexer中的通道(隐藏)语法来实现这一点。所以我的问题是如何在lexer中的两种状态之间切换。否则我必须创建两个语法。我只想补充一点,我使用CommonTokenStream提取变量和函数赋值的位置。规则通道(隐藏)在令牌流中包含空格(我想在常规解析过程中避免空格,但在重构解析过程中却没有空格)。您可能想查看ANTLR手册的第4.5节(“重写输入流”)的标题。使用令牌流重写器,您的解析器仍然不会“看到”“隐藏通道上的令牌,但您可以使用TokenStreamRewriter上的方法(它确实跟上隐藏通道)修改流并将其写回。调用修饰符方法后,只需在重写时调用getText(),修改后就可以返回完整的输入流。它将包含来自隐藏通道的内容。但是TokenStreamRewriter还会看到跳过的令牌吗?因为在我的主要语法中需要lexer表达式:WS:[\t]+->skip;用于常规解析。隐藏通道对我有效,但仅对重构parsings有效。如果我不在主要解析过程中使用CommonTokenStream(访问我为检测变量和函数而拆分的令牌),则跳过通道有效。类似于:Interval sourceInterval=ctx.getSourceInterval();int start=sourceInterval.a;令牌分配=令牌.get(开始+2);
public List<Token> getTokens(int start, int stop, int ttype)