1
以下代码取自Gnu Pascal测试代码,它将在Free Pascal中很好地编译。我可以理解它是如何工作的。设置两侧不同类型的比较
var s1 : set of 0..255;
s2 : set of 64..128;
ok : boolean;
procedure p1;
begin
if s1 = s2 then begin
writeln('failed1');
ok := false;
end;
end;
但是,我有点好奇,什么规则是集兼容性和你所期望的。例如:
program p;
var
a : set of 0..10;
b : set of 20..100;
s : integer;
begin
b := [20];
a := [];
if a = b then
writeln('a')
else
writeln('b');
end.
这会打印'b'。但是如果我有两个空集(b := [];
),那么他们被认为是平等的。
我只是试图让我的头脑如何实际得到实施。
(我是什么样的想法是,这两个集转换为范围的联盟,因此要创建set of 0..100
,并从a
和b
2米的临时对象set of 0..100
,然后比较这些做的临时)。
感谢。由于我正在编写我自己的编译器,所以我宁愿不太看别人的编译器代码。 –
如果你正在编写一个编译器,你可能需要一个编译器处理语言的书面规范。在Pascal的情况下,您可能会考虑ISO/IEC 7185(也称为标准帕斯卡)。 – Stuart
@Stuart:是的,但是阅读规范实际上并不能解释不同集合类型会发生什么(至少不是我阅读规范 - 而上述测试不是我目前所用的“iso7185pat.pas”的一部分运行[并通过,除了从函数跳转到“主”])。在我开始减少不必要的大集合之前,这在我的编译器中没有问题 - 如果所有集合的长度都是512或1024,无论内容如何,这都不是问题。 –