2015-09-12 45 views
1

我正在嘗試構建一個編譯器,目前我已經完全迷失了。我有一個主類,並希望能夠與繼承申報的其他類,即class newClass extends classThatHasBeenDeclaredBefore { }我輸入看起來像在語法中獲取列表

input:  
    class_main class_list { /* New program created */ } 

和我class_list包括我在我的程序中所有類的,也可以是空的。

一個簡單的類聲明如下:

class_decl: 
    CLASS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Ok new class is created */} 

    | CLASS_KWORD CLASS_ID EXTENDS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Has CLASS_ID Number 2 been declared before? */ } 
; 

有什麼辦法,我可以檢查第二CLASS_ID已經宣佈或之前以某種方式使用?我的想法是,我的class_list無法從我嘗試添加新課程的位置獲得,但我吮吸OCaml。

回答

1

一個乾淨的方式來處理像這樣的問題是從輸入中創建一個抽象語法樹。然後,您可以在閒暇時對其應用語義檢查。

如果你想在分析過程中做所有的檢查,你必須小心地定義你的語法來允許它,並且傳遞數據結構來定義你到目前爲止所看到的。