Java用什么技巧来避免>>中的空格?

时间:2010-05-11 05:38:15

标签: java c++ templates generics grammar

在Java Generic Book中,虽然对比C ++模板和Java Generic之间的区别,但是:

  

在C ++中,出现了一个问题因为>>   没有空格表示   右移算子。 Java修复了   语法中的技巧问题。)

这是什么伎俩?

5 个答案:

答案 0 :(得分:9)

OpenJDK javac解析器JavacParser按摩词法分析器GTGTGTEQ>>>=),GTGTEQGTEQGTGTGT({ {1}})和>>>在解析类型参数时,使用少一个“GTGT”字符进入令牌。

以下是来自>

的神奇片段
JavacParser#typeArguments()

人们可以清楚地看到它确实是一种技巧,而且它在语法中:)

答案 1 :(得分:5)

这实际上是在下一版本的C ++中修复的。真的没有太大的伎俩;如果你遇到>>在解析通用或模板的过程中,而不是您期望的>,那么您已经有足够的信息来生成错误消息。而且,如果您有足够的信息来生成错误消息,您还有足够的信息来解释>>作为两个单独的令牌:>然后是>。

答案 2 :(得分:5)

这是一个简单的解析器/ lexer hack。词法分析器通常将对>>识别为单个令牌。但是,在解析泛型类型的过程中,解析器会告诉词法分析器不要识别>>

从历史上看,为了简化实现,C ++并没有这样做,但它可以(并且将会)使用相同的技巧来修复。

答案 3 :(得分:2)

这不是一个真正的技巧,他们只是定义了语法,使得右移位令牌与两个直角括号同义(从而允许该令牌关闭模板)。您仍然可以创建必须用括号解析的歧义,但无需开发人员干预即可解析明确的序列。这也是在C ++ 0x中完成的。

答案 4 :(得分:1)

The Java Language Specification, Third Edition显示完整的语法,两个移位运算符都列在InfixOp生成中,没有(明显的)技巧。确定哪个操作>,>>或>>>是有意的,将由扫描仪使用lookahead技术决定。