语形之下和语形之上
经过一系列复杂的分析,发现其实编译器可以分成两个层面:语形(Syntax)之下和语形之上。
特别地,语形之下这个层面,实际上是一大堆的符号识别和处理,包括整个源代码,都可以看成由一系列的符号和符号之间的关系,符号的属性,等等构成的一张复杂的图。在语形之下这个层面,所作的其实是将输入组织为这张图(进一步,一般又可以看成是一棵树)。语法解析一定程度上就是语形之下。语形之下又包括三个层次:lexer,tokenizer,parser。
语形之上这个层面,则根据语形之下的运行过程的结果,做语义的检查,并将语言翻译为对象语言。
但是这两个层面现在被类型论贯通了,而面向对象又将类型和属性、定义、函数这些东西耦合起来。
有歧义的表达式
一个有点意外的事情是尖括号的处理(<,>),这里有个问题,例如下面的语句:
a<b> x;
这个语句实际上有两种解释的方法:
- a<b> 是一种类型,x为a<b>类型的变量
- 先计算 a<b 然后计算 (a<b) > x (或者从右向左结合)
那么编译器怎么能判定应该用那种解释的方法呢?如果不知道a是一个类模板,似乎就不能知道是第一种解释而不是第二种解释。这将会引入一个问题,在解析a<b> x的时候,还需要知道a是否是一个类模板,才能判定怎么解析。
我不知道c++的编译器是怎么做的,为了避免这个问题,现在使用方括号来表示类模板的参数……然后好像就没有这类的问题了。
子类型
继承和模板看着完全不同,但很大程度上似乎有着相似的功能,这里我还分不开,讲不清楚。但是现在有意引入额外的类型系统,大概是这样定义的:
- (规则1)P类:表示一个参与计算过程的类。
- (规则2)P类的Ultra类:一个只有纯虚函数没有值属性的类,P类的Ultra类有着P类的全部函数的纯虚函数版本。P类是P类的Ultra类的子类型(subtype),并重写(实现)了这些纯虚函数。
- (规则3)P类的表现类:如果A类是P类的表现类,则A类一定不是Ultra类,且P类是A类的Ultra类的子类型。
这个定义没有使用“继承”这个术语,而是使用了“子类型”这个术语。
在翻译为c++代码的时候,每个P类会被翻译为两个类:P类和P_Ultra类。
在语法上,引入一个语法称为A类表现B类。使用“表现”而不是“继承”的一个好处是可以循环,例如:
A 表现 B, C;
B 表现 A, C;
C 表现 A, B;
翻译成c++以后,就变成 A,B,C实际上都是 A__Ultra, B__Ultra 和 C__Ultra 的子类, 但 A B C 又分别只有各自的数据。
还未解决的问题
是否能取消继承,还不确定,可能还有问题还待验证(保留子类型和组合类型)。
我总感觉已经有类似的技术,但我不知道叫什么。
类型检查和基础类型相关的机制(暂时称为“基础类型”?)还没完成。
当前的代码
下面的代码已经可以翻译了:
包(TestPackage);
可以之类 数学实体 {}
可以之类 判定机 {}
可以之类 矩形 表现 数学实体 {
浮点数 长_;
浮点数 宽_;
浮点数 长(){
返回 长_;
}
浮点数 宽(){
返回 宽_;
}
浮点数 面积(){
返回 长_ * 宽_;
}
}
可以之类 形状判定机 表现 判定机 {
布尔量 判定_正方形(矩形 a){
返回 (a.长() > 0) && (a.长() == a.宽());
}
}
先这样吧。感觉我32岁之前把这个东西做出来还是有点难的……
翻译出来来的.h文件:
/* Primitive Types */
typedef double 浮点数;
typedef bool 布尔量;
typedef int 整数;
/* Head Files */
/* Class Forward */
class 数学实体_Ultra;
class 数学实体;
class 判定机_Ultra;
class 判定机;
class 矩形_Ultra;
class 矩形;
class 形状判定机_Ultra;
class 形状判定机;
/* Class */
class 数学实体_Ultra {
};
class 数学实体 : public 数学实体_Ultra {
public:
using UltraType = 数学实体_Ultra;
public:
};
class 判定机_Ultra {
};
class 判定机 : public 判定机_Ultra {
public:
using UltraType = 判定机_Ultra;
public:
};
class 矩形_Ultra {
virtual 浮点数 长() const = 0;
virtual 浮点数 宽() const = 0;
virtual 浮点数 面积() const = 0;
};
class 矩形 : public 数学实体_Ultra, public 矩形_Ultra {
public:
using UltraType = 矩形_Ultra;
public:
浮点数 长_;
浮点数 宽_;
virtual 浮点数 长() const override;
virtual 浮点数 宽() const override;
virtual 浮点数 面积() const override;
};
class 形状判定机_Ultra {
virtual 布尔量 判定_正方形(矩形 a) const = 0;
};
class 形状判定机 : public 判定机_Ultra, public 形状判定机_Ultra {
public:
using UltraType = 形状判定机_Ultra;
public:
virtual 布尔量 判定_正方形(矩形 a) const override;
};
翻译出来的cpp文件:
/* Head Files */
#include "TestPackage\test.h"
/* Gen code for 数学实体 */
/* Gen code for 判定机 */
/* Gen code for 矩形 */
浮点数 矩形::长() const
{
return 长_;
}
浮点数 矩形::宽() const
{
return 宽_;
}
浮点数 矩形::面积() const
{
return (长_*宽_);
}
/* Gen code for 形状判定机 */
布尔量 形状判定机::判定_正方形(矩形 a) const
{
return ((((a.长)()>0))&&(((a.长)()==(a.宽)())));
}
最后
春节快乐!
发表回复