我正在尝试解析目前正在使用Ruby库Parslet解析的ANTLR中的一种现有语言。
下面是我的语法的精简版本:
grammar FilterMin;
filter : condition_set;
condition_set: condition_set_type (property_condition)?;
condition_set_type: '=' | '^=';
property_condition: property_lhs CONDITION_SEPARATOR property_rhs;
property_lhs: QUOTED_STRING;
property_rhs: entity_rhs | contains_rhs;
contains_rhs: CONTAINS_OP '(' contains_value ')';
contains_value: QUOTED_STRING;
entity_rhs: NOT_OP? MATCH_OP? QUOTED_STRING;
// operators
MATCH_OP: '~';
NOT_OP: '^';
CONTAINS_OP: 'contains';
QUOTED_STRING: QUOTE STRING QUOTE;
STRING: (~['\\])*;
QUOTE: '\'';
CONDITION_SEPARATOR: ':';此解析器无法使用相同的mismatched input ':' expecting ':'或mismatched input ':contains(' expecting ':'同时解析='foo':'bar'和='foo':contains('bar')。
为什么这些输入不能解析?
发布于 2018-08-04 06:19:38
您的STRING规则将匹配除反斜杠或单引号以外的所有内容。因此,它与除QUOTED_STRING之外的所有其他词汇规则重叠。因为词法分析器总是选择生成最长匹配的规则,并且几乎总是STRING,所以您的词法分析器将生成一堆STRING标记,而不是任何CONDITION_SEPERATOR标记。
由于您从不在解析器规则中使用STRING,因此它不需要是实际类型的令牌。实际上,您永远不会希望生成STRING令牌,您只希望将其作为QUOTED_STRING令牌的一部分进行匹配。因此,它应该是一个fragment。
https://stackoverflow.com/questions/51680437
复制相似问题