我正在使用ANTLR为类似java的语言生成识别器,以下规则用于识别泛型类型:
referenceType
: singleType ('.' singleType)*
;
singleType
: Identifier typeArguments?
;
typeArguments
: '<' typeArgument (',' typeArgument)* '>'
;
typeArgument
: referenceType
;
现在,对于以下输入语句,ANTLR会产生“无可行替代”错误。
Iterator<Entry<K,V>> i = entrySet().iterator();
但是,如果我在两个连续'&gt;'之间加一个空格字符,不会产生错误。接缝是ANTLR无法区分上述规则和用于识别移位表达式的规则,但我不知道如何修改语法来解决这种歧义。任何帮助将不胜感激。
答案 0 :(得分:1)
你可能在词法分析器中有如下规则:
RightShift : '>>';
要让ANTLR将>>
识别为两个>
字符或一个>>
运算符,根据上下文,您需要将移位运算符放在解析器中:
rightShift : '>' '>';
如果您的语言包含>>>
或>>=
运算符,则还需要将这些运算符移动到解析器中。
要验证不允许x > > y
,您需要对生成的解析树(ANTLR 4)或AST(ANTLR 3)进行传递,以验证两个>
个字符由rightShift
解析器规则解析按顺序出现。
答案 1 :(得分:-1)
280Z28在他的诊断中可能是正确的,你有一个像
这样的规则RightShift : '>>';
另一种解决方案是明确包括尾随&gt;&gt;的可能性。在你的解析器中。 (我在其他语法中看到过这种情况,但仅限于LALR。)
typeArguments
: ('<' typeArgument (',' typeArgument)* '>') |
('<' typeArgument ',' referenceType '<' typeArgument RightShift );
;
在Antlr3中,需要将其考虑在内。
这是否更清晰或是否有第二次验证可以验证您的右移操作符取决于您需要使用它的频率。