当前位置: 首页 > 知识库问答 >
问题:

将CommonTokenStream切换为忽略或启用空白

郭永怡
2023-03-14

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

WS      :   [ \t]+ ->  skip ;

但是对于重构方法,我需要将空格标记发送到隐藏通道以根据此接收器使用TokenStreamReWriter:ANTLR4:TokenStreamReWrit输出没有正确的格式(删除空格)

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

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

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

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

共有1个答案

晁砚
2023-03-14

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

WS[\t]-

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

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

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

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

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

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

 类似资料:
  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f

  • 问题内容: 我目前正在使用杰克逊2.1.4,并且在将对象转换为JSON字符串时忽略字段时遇到了一些麻烦。 这是我的类,它充当要转换的对象: 这是我如何转换它: 这是输出: 如何避免这些空值?我只想获取“订阅”目的所需的信息! 这正是我要查找的输出: 我还尝试了@JsonInclude(Include.NON_NULL)并将所有变量都设置为null,但是它也不起作用!感谢您的帮助! 问题答案: 您将

  • 下面是我的类,它充当要转换的对象: 下面是我的转换方法: 输出如下: 下面正是我要查找的输出: 我还尝试了@jsonInclude(include.non_null),并将我的所有变量置为null,但也没有起作用!谢谢你们的帮助!

  • 问题内容: 我正在使用Java 7的新功能进行POC。我有在switch语句中使用String的代码,它可以工作。我也想使其不区分大小写。有没有一种方法可以在String上使用ignoreCase签出? 问题答案: 不,但是您可以打开。所以: 在我们挑剔的时候,您最好在英语语言环境中使用大写字母,以避免出现土耳其语问题

  • 问题内容: HTML / CSS中是否有任何内容可以告诉浏览器完全忽略空格? 如此多次,当您想要将两个图像彼此并排放置时-拼命尝试使HTML可读,但是浏览器在它们之间放置了一个空格。 因此,而不是像这样: 你最终得到这个 真是太恐怖了! 问题答案: 哦,您只需一行CSS就可以轻松实现: 劣势,你问?尚无 浏览器实现此 极其有用的功能(通常考虑内联块)。 我有时会做些什么,尽管黑夜很丑,但还是要使用

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f