-> skip 会改变词法分析器规则优先级的行为吗?

Does -> skip change the behavior of the lexer rule precedence?

我正在编写语法来解析来自封闭系统的配置导出文件。当导出文件中标识的参数分配有特别长的字符串值时,导出文件会经常在该值中插入“\r\n\t”(包括双引号)。在文件中,我会看到如下内容:

"stuff""morestuff""maybesomemorestuff"\r\n\t"morestuff""morestuff"...等等

在那一行中,“”是导出文件对作为实际字符串值的一部分的“进行转义的方式 - 而不是表示字符串值结尾的单个”。

我目前将此字符串值传递给解析器的语法方法是将 "stuff" 作为标记,将 \r\n\t 作为标记。所以我有这样的规则:

quoted_value : (QUOTED_PART | QUOTE_SEPARATOR)+ ;

QUOTED_PART : '"' .*? '"';
QUOTE_SEPARATOR : '\r\n\t';
WS : [ \t\r\n] -> skip;  //note - just one char at a time

我在 lex 或解析示例字符串时没有收到任何错误。然而,在令牌流中 - 没有 QUOTE_SEPARATOR 个令牌出现,而且流中实际上没有任何令牌应该在的地方。

我原以为 QUOTE_SEPARATOR 比 WS 长,而且它在语法中排在第一位,它会被选中,但它的行为就像 WS 被匹配并且字符被跳过而不发送到令牌字符串。

-> 跳过是否会改变规则优先级的工作方式?

我也愿意接受完全删除“\r\n\t”(所有五个字符)的词法分析的不同方法 - 这种方法似乎更容易,对于将要处理的程序来说应该足够容易解析树要处理,因为对数据的其他操作无论如何都会在那里完成(我的第一个语法 - 教我;))。

不,skip 不影响规则优先级。

QUOTE_SEPARATOR 规则更改为

QUOTE_SEPARATOR : '\r\n\t' ;

为了匹配源字符串的实际文本内容。