1

我正在使用 ANTLR 为类 java 语言生成识别器,以下规则用于识别泛型类型:

referenceType
:   singleType ('.' singleType)*
;

singleType
: Identifier typeArguments?
;

typeArguments
:   '<' typeArgument (',' typeArgument)* '>' 
;

typeArgument
:    referenceType
;

现在,对于以下输入语句,ANTLR 会产生“没有可行的替代方案”错误。

Iterator<Entry<K,V>> i = entrySet().iterator();

但是,如果我在两个连续的 '>' 字符之间放置一个空格,则不会产生错误。ANTLR似乎无法区分上述规则和用于识别移位表达式的规则,但我不知道如何修改语法来解决这种歧义。任何帮助,将不胜感激。

4

2 回答 2

1

您可能在词法分析器中有如下规则:

RightShift : '>>';

要使 ANTLR 识别>>为两个>字符或一个>>运算符,取决于上下文,您需要将移位运算符放在解析器中:

rightShift : '>' '>';

如果您的语言包含>>>or>>=运算符,则也需要将它们移至解析器。

要验证这x > > y是不允许的,您需要通过生成的解析树 (ANTLR 4) 或 AST (ANTLR 3) 来验证解析器规则>解析的两个字符是否按rightShift顺序出现。

于 2013-04-15T15:55:35.107 回答
-1

280Z28 在他的诊断中可能是正确的,你有一个规则

RightShift : '>>';

另一种解决方案是在解析器中明确包含尾随 >> 的可能性。(我在其他语法中看到过这一点,但只在 LALR 中看到过。)

typeArguments
:   ('<' typeArgument (',' typeArgument)* '>') |
    ('<' typeArgument ',' referenceType '<' typeArgument RightShift );

;

在 Antlr3 中,这将需要考虑在内。

这是否更清晰或有第二遍验证您的右移运算符取决于您需要使用它的频率。

于 2013-04-15T18:34:28.823 回答