首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不匹配的输入?错误的列序?

不匹配的输入?错误的列序?
EN

Stack Overflow用户
提问于 2014-09-08 15:07:15
回答 1查看 155关注 0票数 0

我已经开始使用Antlr为自定义的DSL生成解析器。该语言接受一个文件并对其进行过滤。

我的语法看起来如下(简称):

代码语言:javascript
复制
grammar ParserGrammar;
filter              :   FILTER' '(TYPE|INSTANCE) (((' 'SPECIFIER)+)|((' 'SPECIFIER)*'         'EXCLUDE(' 'SPECIFIER)+))' '(WHERE condition)?;
condition           :   (attributecondition|propertycondition|quantitycondition)+ ('&&' condition)?;
attributecondition  :   ATTRIBUTE SPECIFIER comparisonoperation SPECIFIER;
propertycondition   :   PROPERTY SPECIFIER SPECIFIER comparisonoperation SPECIFIER;
quantitycondition   :   QUANTITY SPECIFIER comparisonoperation SPECIFIER;
comparisonoperation :   (EQUALS|GREATER|LOWER|GREATEREQ|LOWEREQ);

check               :   CHECK (entitycheck|relationcheck) (checkoperation COUNT)?;
entitycheck         :   ENTITY SPECIFIER* (HAVING (attributecheck|quantitycheck|propertycheck))?;
attributecheck      :   ATTRIBUTE SPECIFIER;
quantitycheck       :   QUANTITY SPECIFIER;
propertycheck       :   PROPERTYSET SPECIFIER (HAVING PROPERTY SPECIFIER)?;
relationcheck       :   RELATION SPECIFIER+ WITH SPECIFIER+;
checkoperation      :   '-'(EQUALS|GREATER|LOWER|GREATEREQ|LOWEREQ);

FILTER      :   F I L T E R;
CHECK       :   C H E C K;
TYPE        :   '-'T Y P E;
INSTANCE    :   '-'I N S T A N C E;
EXCLUDE     :   '-'E X C L U D E;
WHERE       :   '-'W H E R E;
ATTRIBUTE   :   A T T R I B U T E;
PROPERTY    :   P R O P E R T Y;
QUANTITY    :   Q U A N T I T Y;
EQUALS      :   E Q U A L S;
GREATER     :   G R E A T E R;
LOWER       :   L O W E R;
GREATEREQ   :   GREATER E Q;
LOWEREQ     :   LOWER E Q;
ENTITY      :   E N T I T Y;
RELATION    :   R E L A T I O N;
HAVING      :   '-'H A V I N G;
PROPERTYSET :   PROPERTY S E T;
COUNT       :   Num+('.'Num+)?;
WITH        :   '-'W I T H;
SPECIFIER   :   ('"'(~'"')+'"')|(~'"')+;


fragment Num :  ('0'..'9');
fragment A:('a'|'A');
//skipped here
fragment Z:('z'|'Z');

因此,假设我想解析这个输入: filter -type abc

然后我得到:

代码语言:javascript
复制
mismatched input 'filter -type abc ' expecting FILTER

问题是,如果我碰上了莱克规则说明符

代码语言:javascript
复制
SPECIFIER : 'abc'

我输入:过滤器,-type,abc,它工作得很好。

我相信这是一个问题的雷克萨斯排序与贪婪的匹配?即使我不明白为什么,因为我认为Antlr采用了第一个匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面。

提前谢谢你,

斯蒂芬恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-08 19:54:55

我以为Antlr采用了第一个匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面。

好吧..。这不是完全正确的。ANTLR首先采用最长的匹配规则,只有当多个规则匹配相同的令牌长度时,才能选择最先出现的匹配规则。

您的SPECIFIER规则太宽,匹配的文本太多,请尝试缩小范围。一般来说,使用包容性规则要比使用排他性规则要好,这正是因为这种匹配策略。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25727383

复制
相关文章

相似问题

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