Java使用什么技巧来避免>>?

unj*_*nj2 16 c++ java generics grammar templates

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

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

这个伎俩是什么?

msa*_*ord 9

在OpenJDK javac的解析器,JavacParser,按摩词法分析器令牌GTGTGTEQ(>>>=), ,GTGTEQ,GTEQ(GTGTGT),>>>GTGT与一个少"令牌>"字符解析类型参数时.

这是一段神奇的片段JavacParser#typeArguments():

    switch (S.token()) {
    case GTGTGTEQ:
        S.token(GTGTEQ);
        break;
    case GTGTEQ:
        S.token(GTEQ);
        break;
    case GTEQ:
        S.token(EQ);
        break;
    case GTGTGT:
        S.token(GTGT);
        break;
    case GTGT:
        S.token(GT);
        break;
    default:
        accept(GT);
        break;
    }
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*yan 5

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

  • 这在C++的情况下是不正确的,因为`A <1 << b >> c>`是具有单个序数参数的有效泛型类型,`1 << b >> c`. (2认同)

Mar*_*tos 5

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

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