从标识符词法规则中排除标记

时间:2014-09-08 19:25:17

标签: antlr antlr3

我有标识符词法规则:

Identifier
:   ( 'a'..'z' | 'A'..'Z' | '_' ) ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' )*
;

LogicalOr和LogicalAnd规则:

LogicalOr       :   '| ' | '||' | OR;
LogicalAnd      :   '&' | '&&' | AND;
fragment Or : '[Oo][Rr]';
fragment And : '[Aa][Nn][Dd]';

字符串"和"和"或"被识别为标识符,而不是logicalAnd和logicalOr。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

有两个潜在的问题在起作用。首先,ANTLR 3不支持ANTLR 4引入的字符类语法。您的Or片段字面上匹配输入[Oo][Rr];它与ORoroR不匹配。这同样适用于您的And片段。你需要写这样的规则:

fragment
Or
  : ('O' | 'o') ('R' | 'r')
  ;

如果这不能解决您的问题,那么您需要确保LogicalOrLogicalAnd规则位于语法中的Identifier规则之前。首先出现的规则将确定为此输入序列分配的令牌类型。