我正在编写一个语法来解析封闭系统中的配置导出文件。当导出文件中标识的参数具有分配给它的特别长的字符串值时,导出文件会在值中经常插入“\ 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”(所有五个字符) - 这种方式看似简单,对于处理这个问题的程序来说应该很容易解析树处理,因为其他操作数据将在那里完成(我的第一个语法 - 教我;))。
答案 0 :(得分:0)
不,skip
不会影响规则优先级。
将QUOTE_SEPARATOR
规则更改为
QUOTE_SEPARATOR : '\\r\\n\\t' ;
以匹配源字符串的实际文本内容。