是 - >跳过更改词法分析器规则优先级的行为?

时间:2017-04-13 23:58:13

标签: parsing antlr4

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

“东西” “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匹配了并且字符被跳过而没有发送到令牌字符串。 / p>

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

我也对lexing的另一种方法持开放态度,它完全删除了“\ r \ n \ t”(所有五个字符) - 这种方式看似简单,对于处理这个问题的程序来说应该很容易解析树处理,因为其他操作数据将在那里完成(我的第一个语法 - 教我;))。

1 个答案:

答案 0 :(得分:0)

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

QUOTE_SEPARATOR规则更改为

QUOTE_SEPARATOR : '\\r\\n\\t' ;

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