我已经开始使用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'我输入:过滤器,-type,abc,它工作得很好。
我相信这是一个问题的雷克萨斯排序与贪婪的匹配?即使我不明白为什么,因为我认为Antlr采用了第一个匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面。
提前谢谢你,
斯蒂芬恩
发布于 2014-09-08 19:54:55
我以为Antlr采用了第一个匹配的lexer规则。在我的例子中,规则过滤器和类型在说明符前面。
好吧..。这不是完全正确的。ANTLR首先采用最长的匹配规则,只有当多个规则匹配相同的令牌长度时,才能选择最先出现的匹配规则。
您的SPECIFIER规则太宽,匹配的文本太多,请尝试缩小范围。一般来说,使用包容性规则要比使用排他性规则要好,这正是因为这种匹配策略。
https://stackoverflow.com/questions/25727383
复制相似问题