2009-08-22 99 views
5

我需要一些資源開始(我是一個cs學生)編寫解析器和編譯器的最佳編程語言是什麼?

+1

Dupe of http://stackoverflow.com/questions/1669/learning-to-write-a-compiler許多其他許多人 – 2009-08-22 09:16:37

+0

如果這是對資源的開放式請求,他們尼爾是正確的。如果它要求比較和對比,那麼它就接近「主觀和議論性」 – dmckee 2009-08-22 17:05:35

+0

請參見[編譯器在什麼程度上是最好的語言](http://stackoverflow.com/問題/ 809710 /什麼是最好的語言編寫的編譯器) – nawfal 2014-07-21 11:45:17

回答

9

答案在這裏可以是非常主觀的。但如果你想編寫一個解析器,我建議使用ANTLR。目前ANTLR支持C,C#,ActionScript,JavaScript和Java目標。根據我的經驗,Java版本使用起來非常穩定,並已用於許多強大的開源項目,即DroolsHibernate

2

Lisp/Scheme是我們負責使用回單一的任務。

他們很善於完成任務。

2

雖然我曾經有過題爲「在現代的Java編譯器實現」一文的書,我認爲專業人士仍然使用C.除了證明他們的語言可以編譯本身。

6

是否需要用編程語言編寫?或者你可以使用FlexBison

+1

我正在建議Flex和Bison。 :-) – 2009-08-22 08:05:46

+4

解析器生成器不會消除編程語言的需要。他們用特定的語言生成解析器。傳統的Flex/Bison(LEX/YACC)語言是C. – Brannon 2009-08-22 08:47:59

+0

@Brannon +1以供您評論;你仍然需要一種編程語言。不過,我想補充一點,Flex/Bison或Lex/Yacc相當不合時宜。如果你已經使用了Coco/R之類的東西,並且你去了Lex/Yacc,那麼你會發現自己絕望的功能,其中最重要的是超過一個。 – Imagist 2009-09-24 17:37:38

0

是否想爲通用語言編寫解析器?在這種情況下,明確推薦使用目標語言編寫(和引導)。你應該吃自己的狗糧。

+1

我會說,「在許多情況下推薦」,而不是「明確推薦」。 「通用語言」有點用詞不當,因爲沒有適合所有*任務的語言。我不會用C編寫Web應用程序,我不會用Python編寫操作系統。這並不是說你不能做這些事情。只是這樣做不合適。如果你接受這個邏輯,那麼你就有可能寫一個不適合解析的通用語言,因此不應該用它來解析它自己。 – Imagist 2009-08-22 09:46:23

+1

下面是一個很好的例子:STEPS項目的* entire * JavaScript解釋器只有170行的OMeta源代碼,一個下午寫了一個人。在Narcissus JavaScript解釋器中,解析器*單獨*超過1000行JavaScript,另有1000行AST訪問者。所以,使用JavaScript來實現JavaScript比使用OMeta要冗長10倍。 – 2009-08-22 15:56:27

+0

但是如果你真的使用了你的解析器/編譯器,你會拋出大量的錯誤。你真的通過在這種語言中實現它來使用它。 – Mnementh 2009-08-22 21:05:20

1

如果您從頭開始實施編譯器,大多數編程語言都可以完成該任務。 (我甚至知道使用Fortran IV和COBOL編寫的編譯器/解析器,儘管我不會推薦嘗試這樣做!)

但是,如果您嘗試實現的語言甚至有一個不平凡的語法,使用詞法分析器生成器和/或解析器生成器來實現前端更好。你會得到一個更快,更可靠的解析器。

因此,在此基礎上,可以使用合適的編程語言,可以使用合適的編程語言。在Wikipedia上有一個頁面比較了大量的解析器生成器。我沒有意識到有這麼多!

1

如果你的目標是學習解析器(和標記器)背後的技術,也許最好從頭開始編寫一個。你可以在大多數編程語言中做到這一點,所以你可以選擇一個你感覺舒服的。

前段時間,我寫了一系列博客文章,展示了用C#編寫一個類似小型虛構類BASIC編程語言的解析器是多麼容易。我不想在此處發送垃圾郵件,所以我不會提供直接鏈接,但是如果您訪問博客(請參閱我的個人資料)並進入底部,可以在「我的帖子」中找到「編寫分析程序」鏈接「-部分。

3

你會想看看解析器生成器。如果你是CS學生,那麼你可能會想看看Dragon Book:http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

使用C#或Java構建解析器可能是最容易的,因爲您不必擔心內存管理等問題,並且可以專注於語法。

一個好的C#解析器生成器是GPPG:http://plas.fit.qut.edu.au/gppg/

+0

有人可以解釋爲什麼這是downvoted?龍書是一個很好的資源,並且c#/ java恰好遵循了這個問題的單詞。雖然我認爲這個問題本身很愚蠢。 – gimpf 2009-08-22 09:23:05

4

解析器和編譯器是兩個獨立的問題。例如,我可能會在C編寫一個編譯器,但我絕不會在C中編寫解析器(我會使用解析器生成器)。對於速度不是高優先級的非常簡單的解析器,我可能用Perl或Python手動編碼解析器,它們具有良好的文本操作功能。但對於非常基本的解析器之外的任何東西,我都會使用某種解析器生成工具。最常用的是ANTLR,Coco/RLex/Yacc以及GNU實現Flex/Bison。我的個人偏好是Coco/R,但ANTLR似乎現在更受歡迎。

如果您正在編寫通用編程語言,您可能需要考慮自己編寫它。這有很多好處,包括可移植性(人們只需要移植第一版本的語言)和功能演示(解析是一個難題,所以如果可以用您的語言來完成,那麼這是對您的語言的證明)。如果您的語言被解釋,這可能不適合性能方面的原因。