2010-01-13 194 views
11

使用F#解析AST來構建解釋器的最佳方式是什麼?有很多F#示例用於簡單的語法(基本算術操作),但我似乎無法找到具有更多功能範圍的語言的任何內容。F#解析抽象語法樹

歧視工會看起來非常有用,但你將如何去建造一個有大量的選項?在其他地方定義類型(比如加法,減法,條件,控制流)是否更好,並將它們作爲聯合中的預定義類型一起使用?

或者我錯過了一些更有效的書寫口譯手段嗎?是否有更有效的每種類型的eval函數,或者可能使用monads?

在此先感謝

回答

13

識別聯合看起來是 incrediably有用的,但你會如何 去構建一個大 多種選擇? 是否更好地在其他地方定義了類型(例如,加法, 減法,條件,控制 流),並將它們作爲 聯合中的預定義類型一起定義爲 ?

我不確定你在這裏問什麼;即使有大量選項,DU仍然很容易定義。見例如this blog entry是一種微型語言的DU結構(以及有關編寫樹型變換的更一般的討論)。擁有更多案例的DU是很好的事情,並且在編譯器/解釋器中通常使用這種表示。至於解析,我更喜歡monadic解析器組合器;請查看FParsec或查看this old blog entry。在使用這種解析器組合器之後,我永遠無法回到像lex/yacc/ANTLR這樣的任何東西 - 外部DSL似乎比較原始。

(編輯:「微小的算術例子」你已經發現可能是什麼大的解決方案看起來像,以及在「玩具」的例子通常炫耀正確的架構代表相當多。)

+0

鏈接到舊博客條目似乎被打破。 – 2013-12-25 06:53:11

2

我自己還沒有做過翻譯。希望以下幫助:)

Here的耶魯大學使用ML,你可能會發現有用的編譯課程。講義非常簡潔(簡短)和內容豐富。你可以按照前幾個講義和作業。正如你所知道的F#,你不會有閱讀ML程序的問題。

順便說一下,這位教授是A. Appel的學生,他是SML實現的創造者。所以從這些筆記中,你也可以得到最自然的方式來編寫ML族語言的編譯器/解釋器。

2

您可能對F#WikiBook的Lexing and Parsing部分感興趣。 F# PowerPack library包含FsLex和FsYacc工具,這對此很有幫助。 WikiBook指南是開始使用這個軟件的好方法。

除此之外,您需要考慮如何實際執行AST表單中的代碼,這是編譯器和解釋器設計的共同之處。然而,這通常被認爲是更容易的部分,並且在那裏應該提供關於這方面的信息的編譯器/解釋器有大量的一般資源。

3

你應該拿一份Robert Pickering的「Beginning F#」。

的第13章, 「分析文本」,包含FsLexFsYacc一個例子,通過Noldorin的建議。

除此之外,在同一本書的第12章中,作者解釋瞭如何爲他提出的算術語言構建一個實際的簡單編譯器。非常有啓發性。最重要的部分是你在找什麼:AST分析器

祝你好運。

+3

很高興看到人們已經開始閱讀開始的F#:)。我應該指出,第12章還介紹了FParsec(http://www.quanttec.com/fparsec/),這是一個monadic解析器,這可能是我在F#中創建解析器的首選,因爲它意味着您不必使用外部工具和代碼生成。 Rob – Robert 2010-01-13 16:30:20

3

我第二Brian的建議看看FParsec。如果你有興趣用FsLex和FsYacc做老式的學習方法,那麼尋找如何解析非平凡語言的地方就是F#源代碼本身。請參閱分發中的source\fsharp\FSharp.Compiler目錄。

0

This is F#和FParsec的完整Small Basic實現的一個很好的例子。它甚至包括IL編譯器。整個代碼是非常容易獲得的,並附有來自作者的一系列博客文章http://trelford.com/blog/