2013-04-15 35 views
1

我用ANTLR来生成一个类似Java的语言识别和使用以下规则识别泛型类型:没有可行的替代错误

referenceType 
: singleType ('.' singleType)* 
; 

singleType 
: Identifier typeArguments? 
; 

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

typeArgument 
: referenceType 
; 

现在,对于下面的输入语句,ANTLR产生'没有可行的替代'错误。

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

然而,如果我把两个连续的“>”字符之间的空间中,产生没有错误。它接近ANTLR无法区分上述规则和用于识别移位表达式的规则,但我不知道如何修改语法来解决这种歧义。任何帮助,将不胜感激。

回答

1

你可能有这样的词法分析器以下规则:

RightShift : '>>'; 

对于ANTLR识别>>成两个>字符或一个>>运营商,根据上下文,你需要,而不是把你的在解析器移位运算符:

rightShift : '>' '>'; 

如果你的语言包括>>>>>=运营商,这些需要被移动到解析器为好。

要验证x > > y是不允许的,你要做出一个传过来的解析树中(ANTLR 4)或AST(ANTLR 3)验证由rightShift解析器解析规则两个>字符显示按顺序。

-1

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

RightShift : '>>'; 

规则另一种解决方案是明确包括尾随在你的解析器的可能性>>。 (我已经在其他语法看到了这一点,但只有在LALR)

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

; 

在Antlr3,这将需要留下因素。

无论这种情况是否更明确或是否有第二遍验证您的右移运算符取决于您需要多久使用一次。

相关问题