我已经开始使用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前面。
提前致谢,
斯蒂芬
答案 0 :(得分:3)
我认为Antlr采用了第一个匹配的词法分析器规则。在我的例子中,规则FILTER和TYPE位于SPECIFIER前面。
嗯......这不完全正确。 ANTLR首先采用最长匹配规则,并且只有当多个规则匹配相同的令牌长度时,才会选择首先出现的规则。
您的SPECIFIER
规则过于宽泛且文字太多,请尝试缩小范围。一般来说,使用包容性规则比独家恕我直言更好,正是因为这种匹配策略。