2016-02-28 46 views
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,並從ab 2米的臨時對象set of 0..100,然後比較這些做的臨時)。

回答

2

將整數設置爲基本類型(set of之後的類型)始終是兼容的。

你的假設是正確的:一般來說,這兩個集合都轉換爲具有常用範圍的臨時對象,然後比較臨時對象。轉換通過致電fpc_varset_load完成。

如果您有興趣瞭解更多的細節,這決定如何將集轉換的代碼,位於nadd.pas(見1)開始行1593

+0

感謝。由於我正在編寫我自己的編譯器,所以我寧願不太看別人的編譯器代碼。 –

+1

如果你正在編寫一個編譯器,你可能需要一個編譯器處理語言的書面規範。在Pascal的情況下,您可能會考慮ISO/IEC 7185(也稱爲標準帕斯卡)。 – Stuart

+0

@Stuart:是的,但是閱讀規範實際上並不能解釋不同集合類型會發生什麼(至少不是我閱讀規範 - 而上述測試不是我目前所用的「iso7185pat.pas」的一部分運行[並通過,除了從函數跳轉到「主」])。在我開始減少不必要的大集合之前,這在我的編譯器中沒有問題 - 如果所有集合的長度都是512或1024,無論內容如何,​​這都不是問題。 –