2011-02-09 35 views
6

我正在尋找一種簡單的,正式定義的語言,可以在學習編譯器構造時使用。實施第一階段應該很簡單,然後再進一步優化。用於編譯器學習的簡單,正式定義的語言

隨意指出我在lisps的方向,但我特別尋找其他選項。

+1

你可以嘗試實現Pascal的一個子集;請查看[Pascal Implementation](http://homepages.cwi.nl/~steven/pascal/book/) – 2011-02-09 10:32:12

回答

1

奧伯倫規格足夠小爲您的目的:http://www-vs.informatik.uni-ulm.de:81/projekte/Oberon-2.Report/

R5RS或它的一個純粹的功能子集也不是那麼大(如果你忽略數字塔)。

+0

呵呵,我有一本Wirth的書,你可以爲Oberon的一個子集建立一個編譯器。它看起來完全適合這項任務。 – Skurmedel 2011-02-09 11:00:04

2

我會建議Wirth的PL/0

爲什麼?

  • 語法雖小,但仍然有足夠的那裏得到一個好味道開發編譯器:

    program = 
        block "." . 
    
    block = 
        [ "const" ident "=" number {"," ident "=" number} ";"] 
         [ "var" ident {"," ident} ";"] 
         { "procedure" ident ";" block ";" } statement . 
    
    statement = 
        [ ident ":=" expression 
        | "call" ident 
        | "begin" statement {";" statement } "end" 
        | "if" condition "then" statement 
        | "while" condition "do" statement 
        ]. 
    
    condition = 
        "odd" expression 
        | expression ("="|"#"|"<"|"<="|">"|">=") expression 
        . 
    
    expression = 
        [ "+"|"-"] term { ("+"|"-") term} . 
    
    term = 
        factor {("*"|"/") factor} . 
    
    factor = 
        ident | number | "(" expression ")" . 
    
  • 您可以實現虛擬機編譯器PL/0用C大約1000行代碼。

    • 大得足以成爲非平凡的,但足夠小以至於可行。
  • 有與之相關的三本書:

    • 維爾特,尼克勞斯(1975年),算法+數據結構=程序,ISBN 0-13-022418-9(原PL/0規範和實現(在Pascal中))編譯的一個非常溫柔的介紹。

    • Liffick,布萊斯·W·埃德(1979年),帕斯卡的字節書,ISBN 0-07-037823-1(作者開發PL/0的小超,在北極星基本爲 早期CP/M電腦)。

    • Wirth,Niklaus(1986),Compilerbau,B.G. Teubner,斯圖加特國際標準書號3-519-32338-9(PL/0的一個小超集,在Modula 2中實現,用德文)。

  • 網絡充滿了例子。

    • 我在C,C++,Pascal,Modula 2,Java和Ruby中找到了實現。我敢打賭還有更多。
  • 有一個維基百科條目::-)

  • 此外,一對夫婦有幫助的羣體,有很多人願意幫助回答您編寫編譯器問題:

3

我想到了Kernighan和派克的Unix的編程環境第8章是優秀的。它涵蓋了Unix環境中的大部分編程,同時實現了一種編程語言。

第8章被稱爲程序開發。它討論了通過各個設計階段開發一個非平凡的程序。這個不重要的程序是高階計算器。有關更多細節,請參見http://en.wikipedia.org/wiki/Hoc_(programming_language

這對使用標準工具yacc和lex實現簡單語言是一個很好的實踐介紹。 yacc和lex在這裏覆蓋的太多了,但通過遵循本書中的例子和練習,你將發展對它們的理解。

該開發持續不同階段;在第一階段,你甚至沒有語言中的變量。到第三階段,你有變量,定義常量(PI,E等),以及像sin()和log()這樣的內置函數。在最後一個階段,你有完全實施的語言。

現在,特別嘗試和實施最好的語言?我沒有線索,但我知道Unix編程環境是一本很好的書,可以與傳統的編譯器書籍並行讀取。當我開始閱讀Aho編譯器書籍(龍書)時,我重新閱讀了TUPE的第8章,並遵循了示例和練習。當然,任何人都可以從書中重新輸入代碼,但這些練習要求您對發生的事情有很好的理解。

最後,我不認爲你選擇做哪種語言並不重要,而是你在實施過程中遵循的過程。