2011-04-13 83 views
0

我正在編寫玩具OO語言的編譯器。我使用Flex和Bison將它寫入C語言。Flex /野牛多通類解析

考慮下面的語法:

class MyClass { 
    int m_n; 

    void MyFunc(int b) { 
     m_n = 5; 
     m_p = b; 
    } 

    int m_p; 
} 

我當前的代碼會抱怨說,在MYFUNC,M_P尚未宣佈(有很好的理由)。於是,我來到了,我需要一個多通道分析技術得出結論 - 沿着線的東西:

第1次 - 過程變量聲明

第2次 - 過程函數定義

首先 - 是這是解決問題的最好方法嗎?我應該考慮其他方法嗎?其次 - 如果這是一個有利的解決方案,我會繼續使用可重入的詞法分析器/解析器來實現它嗎?

感謝

回答

1

我最近寫了一個編譯器的面向對象的語言,我們必須多遍(根據課程的語言的複雜性):

  1. 收集所有類
  2. 樹立超層次結構
  3. 收集所有方法和字段
  4. 收集方法內的變量等

有我們爲什麼整個過程分成了4個通行證原因:

  1. 不能建立的時候並不是所有的類都被尚未處理的超類層次(導致2通)
  2. 當超類未知時(導致2.通過),您無法驗證繼承的方法(返回值,參數等)
  3. 當尚未收集所有字段時,您無法處理變量(導致4.合格)

如果你當然沒有用你的語言繼承,你可以不用第二遍。

當我現在看它,它應該已經可以合併通2和3的所有數據應可用於通3.

我們實施的方式,它只是通過了AST邊走邊使用所需的符號表對其進行註釋。

+0

你可以看看這個項目:http://svn.c0demonkey.com/listing.php?repname=njc-oo&path=%2Ftrunk%2F#path_trunk_(通過semant.c完成 - 非常複雜代碼儘管:) – halfdan 2011-04-13 22:05:40