切换CommonTokenStream以忽略或启用空白

时间:2016-01-18 10:23:24

标签: antlr4

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

WS      :   [ \t]+ ->  skip ;

但是对于重构方法,我需要将空白标记发送到隐藏通道,以根据此方法使用TokenStreamRewriter: ANTLR4: TokenStreamRewriter output doesn't have proper format (removes whitespaces)

WS      :   [ \t]+ ->  channel(HIDDEN);

问题是,解析器现在将空格识别为我想在默认解析过程中避免使用的标记。

是否可以在同一规则的两个不同实现之间切换,这取决于常规解析过程或重构方法的解析过程(具有相同的语法)?

我需要语义谓词吗?或者CommonTokenStream中是否有可用的方法来跳过或启用whitespacces?

1 个答案:

答案 0 :(得分:0)

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

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

会将这些标记移动到解析器未处理的通道。您不需要语义谓词,也不需要对CommonTokenStream进行任何特殊调用来实现此目的。

这就是我在语法中所做的事情,解析器看不到WS(我有一个稍微不同的WS规则,但没有什么可以产生影响)。

词法分析器(aka tokenizer)独立于解析器(在解析器之前)运行,因此解析器无法做任何事情来影响词法分析器的工作方式(例如,哪个通道令牌放在上面。

您可能还想查看TokenStream上的以下方法:

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

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