在Java Generic Book中,虽然对比C ++模板和Java Generic之间的区别,但是:
在C ++中,出现了一个问题因为>> 没有空格表示 右移算子。 Java修复了 语法中的技巧问题。)
这是什么伎俩?
答案 0 :(得分:9)
OpenJDK javac解析器JavacParser
按摩词法分析器GTGTGTEQ
(>>>=
),GTGTEQ
,GTEQ
,GTGTGT
({ {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技术决定。