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,無論內容如何,這都不是問題。 –