我的原始语法使用skip命令忽略解析过程中的空格。
WS : [ \t]+ -> skip ;
但是对于重构方法,我需要将空白标记发送到隐藏通道,以根据此方法使用TokenStreamRewriter: ANTLR4: TokenStreamRewriter output doesn't have proper format (removes whitespaces)
WS : [ \t]+ -> channel(HIDDEN);
问题是,解析器现在将空格识别为我想在默认解析过程中避免使用的标记。
是否可以在同一规则的两个不同实现之间切换,这取决于常规解析过程或重构方法的解析过程(具有相同的语法)?
我需要语义谓词吗?或者CommonTokenStream中是否有可用的方法来跳过或启用whitespacces?
答案 0 :(得分:0)
我不确定是什么导致了您的问题。您的预期行为是正确的。
WS [\ t] + - >频道(隐藏)
会将这些标记移动到解析器未处理的通道。您不需要语义谓词,也不需要对CommonTokenStream进行任何特殊调用来实现此目的。
这就是我在语法中所做的事情,解析器看不到WS(我有一个稍微不同的WS规则,但没有什么可以产生影响)。
词法分析器(aka tokenizer)独立于解析器(在解析器之前)运行,因此解析器无法做任何事情来影响词法分析器的工作方式(例如,哪个通道令牌放在上面。
您可能还想查看TokenStream上的以下方法:
public List<Token> getTokens(int start, int stop, int ttype)
使用该方法,您可以通过提供评论标记的标记类型作为第三个参数,在开始和停止标记索引中提取评论标记列表。