-> 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' ;
为了匹配源字符串的实际文本内容。
我正在编写语法来解析来自封闭系统的配置导出文件。当导出文件中标识的参数分配有特别长的字符串值时,导出文件会经常在该值中插入“\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' ;
为了匹配源字符串的实际文本内容。