第十章-语义分析之静态语法检查(1)

这篇博客详细介绍了Java的静态语法检查,包括类及接口定义检查、构造函数添加、方法定义检查、变量定义检查以及Java修饰符的合法性验证。内容涵盖了类型检查、循环继承的防止、方法和变量的唯一性检查以及访问权限等关键点。
摘要由CSDN通过智能技术生成

 

参考博文:

(1)Check类之duplicate declaration checking/Class name generation/Type Checking

(2)

 

 

静态检查是指在编译过程中完成各种一致性检查。由于Java是静态类型的语言,所以在编译阶段,可以对各种表达式进行类型检查,以保证类型符合其上下文对它的期望。

静态检查主要包含了类型检查及语法检查。由于Java是面向对象的语言,所以程序源代码中会频繁对类型进行定义、声明及校验。而语法检查是由JLS规范中定义的,针对某个类型、某种结构都有不同的语法规范要遵循。例如,break语句只能存在于一个循环或者switch语句中,局部变量在使用时必须明确初始化等。 

 

Java是单继承的,也就是说Java只能继承一个实现类。但是在继承过程中可能会形成循环,接口也是。

1 Java类及接口定义的检查

Java在定义时会着重检查方法继承、接口实现与类型变量声明。

Type supertype;
if(tree.extending!=null){
    supertype = attr.attribBase(tree.extending, baseEnv, true, false, true);
}else{
    if((tree.mods.flags & Flags.ENUM) != 0){
        JCExpression jce = enumBase(tree.pos, classSymbol);
        supertype =  attr.attribBase(jce, baseEnv,true, false, false);
    }else if(classSymbol.fullname == names.java_lang_Object){
        supertype = Type.noType;
    }else{
        supertype = syms.objectType;
    }
}

如果类定义用extends明确指明了继承的父类,那么就调用Attr.attribBase()方法对父类节点进行标记。否则看这个类是否为枚举类,值得一提的是,Java中将枚举类看为类,将注解定义类看作接口来对待。对于枚举类来说,不能在定义时指明父类,而是通过编译器来自动添加父节点的,调用enumBase()代码如下:

private JCExpression enumBase(int pos, ClassSymbol c) {
    JCExpression jce = make.QualIdent(syms.enumSym); // java.lang.Enum
    JCExpression arg = make.Type(c.type);
    JCExpression result = make.at(pos).TypeApply(jce,List.<JCExpression>of(arg));
    retur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值