首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用二元运算符解析的不匹配输入

使用二元运算符解析的不匹配输入
EN

Stack Overflow用户
提问于 2018-08-04 05:45:39
回答 1查看 25关注 0票数 0

我正在尝试解析目前正在使用Ruby库Parslet解析的ANTLR中的一种现有语言。

下面是我的语法的精简版本:

代码语言:javascript
复制
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')

为什么这些输入不能解析?

EN

Stack Overflow用户

回答已采纳

发布于 2018-08-04 06:19:38

您的STRING规则将匹配除反斜杠或单引号以外的所有内容。因此,它与除QUOTED_STRING之外的所有其他词汇规则重叠。因为词法分析器总是选择生成最长匹配的规则,并且几乎总是STRING,所以您的词法分析器将生成一堆STRING标记,而不是任何CONDITION_SEPERATOR标记。

由于您从不在解析器规则中使用STRING,因此它不需要是实际类型的令牌。实际上,您永远不会希望生成STRING令牌,您只希望将其作为QUOTED_STRING令牌的一部分进行匹配。因此,它应该是一个fragment

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51680437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档