-> skip 是否会更改词法分析器规则优先级的行为?



我正在编写一个语法来解析来自封闭系统的配置导出文件。 当导出文件中标识的参数分配了特别长的字符串值时,导出文件每隔一段时间就会在值中插入"\r\t"(包括双引号)。在文件中,我会看到类似以下内容:

"东西"更多的东西"也许更多的东西"\r\t"更多的东西">

"更多的东西"...等等。

在该行中," 是导出文件转义 " 的方式,"是实际字符串值的一部分 - 而不是单个 " 表示字符串值的结尾。

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

quoted_value : (QUOTED_PART | QUOTE_SEPARATOR)+ ;
QUOTED_PART : '"' .*? '"';
QUOTE_SEPARATOR : 'rnt';
WS : [ trn] -> skip;  //note - just one char at a time

当我对示例字符串进行词典或解析时,我没有收到任何错误。但是,在令牌流中 - 没有显示QUOTE_SEPARATOR令牌,并且流中实际上没有任何内容应该在它们的位置。

我曾期望QUOTE_SEPARATOR比 WS 长,并且它会在语法中首先被选中,但它的行为就像 WS 被匹配并且跳过字符并且没有发送到令牌字符串一样。

-> skip 是否做了一些事情来改变规则优先级的工作方式?

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

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

QUOTE_SEPARATOR规则更改为

QUOTE_SEPARATOR : '\r\n\t' ;

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

最新更新