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