我用Lex和YACC(實際上是Flex和Bison)創建了一個編譯器。該語言允許對任何符號(如C#)的無限前向引用。問題是如果不知道標識符是什麼,就不可能解析語言。如何在編譯器中實現前向引用?
我所知道的唯一的解決辦法是LEX整個源,然後做一個「廣度優先」解析,例如類的聲明和函數聲明,以更高層次的東西得到使用它們的函數之前解析。然而,這對於大文件需要大量內存,並且使用YACC很難處理(我將不得不爲每種類型的聲明/正文創建單獨的語法)。我還必須手動編寫詞法分析器(這不是什麼大問題)。
我並不關心效率的一大部分(雖然它仍然很重要),因爲一旦我完成它就會重寫本身的編譯器,但我希望該版本速度更快(所以如果有的話是Lex/YACC無法完成的快速通用技術,但可以通過手工完成,也請提示他們)。所以現在,開發的便利是最重要的因素。
有沒有解決這個問題的好方法?這通常在C#或Java等語言的編譯器中如何實現?
它無關的關鍵字。它更像這樣:是ABC(包裝AB),(C類),(包裝A),(B類),(C領域)或(Fieled A)(B領域)。(C領域)等等。 – Zifre 2009-05-31 18:35:57
然後我的答案的第二段適用。你不需要知道解析。對待 '。'作爲語法中的一個操作符。在您的AST通行證中,您可以根據符號表檢查它們。 – U62 2009-05-31 18:44:47