ANTLR输入不匹配?错误的词法分析器顺序?

时间:2014-09-08 15:07:15

标签: antlr antlr4

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

我的语法看起来像这样(缩短了):

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

然后我得到:

mismatched input 'filter -type abc ' expecting FILTER

问题是,如果我有机会将词法分析器规则指定为

SPECIFIER : 'abc'

我键入:filter -type abc它工作得很好。

我认为与贪婪匹配有关的词法分析是一个问题? 即使我不明白为什么,因为我认为Antlr采用了第一个匹配的词法分析器规则。在我的情况下,规则FILTER和TYPE位于SPECIFIER前面。

提前致谢,

斯蒂芬

1 个答案:

答案 0 :(得分:3)

  

我认为Antlr采用了第一个匹配的词法分析器规则。在我的例子中,规则FILTER和TYPE位于SPECIFIER前面。

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

您的SPECIFIER规则过于宽泛且文字太多,请尝试缩小范围。一般来说,使用包容性规则比独家恕我直言更好,正是因为这种匹配策略。