在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;
    }
人们可以清楚地看到它确实是一个技巧,它在语法中:)
这实际上是在下一版本的C++中修复的.真的没有太大的伎俩; 如果您在解析通用或模板的过程中遇到>>而不是您期望的那样,那么您已经有足够的信息来生成错误消息.而且,如果您有足够的信息来生成错误消息,您还有足够的信息将>>解释为两个单独的标记:>后跟>.
这是一个简单的解析器/ lexer hack.词法分析器通常将该对识别>>为单个令牌.但是,在解析泛型类型的过程中,解析器会告诉词法分析器不要识别>>.
从历史上看,为了简化实现,C++并没有这样做,但它可以(并且将会)使用相同的技巧来修复.
| 归档时间: | 
 | 
| 查看次数: | 651 次 | 
| 最近记录: |