Parsing 是否->;跳过更改lexer规则优先级的行为?

Parsing 是否->;跳过更改lexer规则优先级的行为?,parsing,antlr4,Parsing,Antlr4,我正在编写语法来解析来自封闭系统的配置导出文件。当在导出文件中标识的参数具有指定给它的特别长的字符串值时,导出文件会每隔一段时间在该值中插入“\r\n\t”(包括双引号)。在该文件中,我将看到如下内容: “stuff”“morestuff”“可能是somemorestuff”\r\n\t“morestuff”“morestuff”…等等。” 在该行中,“”是导出文件转义实际字符串值的一部分的方式-与指示字符串值结尾的单个转义方式相比 我目前的语法方法是将“stuff”作为标记,将\r\n\t作为

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

“stuff”“morestuff”“可能是somemorestuff”\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_分隔符比WS长,并且它是语法中第一个被选中的分隔符,但它的行为就像WS被匹配,字符被跳过,而不是发送到令牌字符串

->skip是否改变了规则优先级的工作方式


我还对完全删除“\r\n\t”(全部五个字符)的词法分析的不同方法持开放态度-这种方法似乎更容易,而且对于处理解析树的程序来说应该足够容易,因为其他数据操作都将在那里完成(我的第一个语法-教我;))。

否,
跳过不影响规则优先级

QUOTE_分隔符
规则更改为

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

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

我认为我不需要转义来匹配回车符、换行符和制表符。为什么它适用于WS,而不适用于引号分隔符?将源字符串转储到十六进制。生成源字符串的任何字符都会转义cf/lf/tab分隔符。因此,
QUOTE_SEPARATOR
需要匹配。这取决于OP对示例的含义。如果代码中真的有换行符和制表符,那么就不需要双重转义。@GRosenberg此语法是一个学习练习。多年前我从零开始编写了自己的解析器(它实际上是一个简单的文件)。我的原始解析器会查找该字符串,如果我在记事本++中查找“\r\n\t”,它会找到需要引号的字符。\u分隔符。我会按照您的建议进行双重检查。什么是OP?OP=原始海报(即您:-))在开始检查解析器之前,转储您的令牌以查看lexer实际匹配了什么。正如我前面所说的,我想我已经这样做了。“在令牌流中,没有引号分隔符令牌出现,并且在流中没有任何标记应该出现的位置”。我对grun使用了-tokens选项。或者您的意思是其他什么?