2011-04-12 56 views
19

我目前正在開發一種通用的基於代理的編程語言(它的syntaxt會受到Java的啓發,我們也使用這種語言的對象)。Can Xtext可用於解析通用編程語言嗎?

自項目開始以來,我們對使用ANTLRXtext的事實懷疑。那時我們發現Xtext正在實現ANTLR的一個子集。所以我們決定使用ANLTR來爲我們的語言失去使用我們的語言免費提供完整的Eclipse編輯器的可能性(Xtext提供了這樣一個很好的功能)。

但是,據我所知,今年夏天Xtext項目已完成big step forward。從鏈接引用:

Xtext的侷限性是什麼?

Sven:您可以使用Xtext實現幾乎所有類型的編程語言或DSL 。有一個例外,那就是如果你需要使用 所謂的'語義謂詞',這是一個相當複雜的事情,我認爲這不值得在這裏解釋。很少有語言真的需要這個概念。然而,突出的例子是C/C++。我們希望 考慮下一個版本的該主題。

而這也加強在Xtext documentation

什麼的Xtext?無論您是想創建小型文本域特定語言(DSL)還是想實現全面的通用編程語言。藉助Xtext,您可以快速創建您自己的語言 。另外,如果您已經有一個現有的 語言,但它缺乏像樣的工具支持,您可以使用Xtext創建一個基於Eclipse的高級開發環境,該編程體驗在現代Java IDE中提供了 編輯體驗,其時間極短。我們稱Xtext爲語言開發框架。

如果Xtext已經擺脫了過去的限制,爲什麼仍然無法找到最好的已知編程語言(Java,C#等)的複雜Xtext語法?

在ANTLR網站上,你可以找到噸這樣的語法例子,對於所關注的Xtext,而不是隻有我能找到的樣本是一個文檔中的報道。那麼Xtext是否仍然不成熟用於實現通用編程語言?我有點擔心這個......我不會開始重新寫的Xtext語法的,然後認識到,它不適合那個。

回答

14

我認爲沒有人實現Java或C++,因爲它有很多工作(即使使用Xtext),現有的工具和編譯器也非常出色。 但是,您可以看看Xbase和Xtend,它是我們隨Xtext一起提供的表達式語言。它使用Xtext構建,對於您可以使用Xtext構建的內容來說是一個很好的證明。我們在約4個月的時間內完成了這項工作。

我做了幾個截屏上的Xtend:

http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html
http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html

注意,你可以簡單地嵌入的Xbase表達式插入到你的語言。

+0

很高興有一位Xtext負責人回覆我的問題,感謝您的關注。我並沒有期望擁有一套完整的工具來處理在Xtext上實現的Java/C++(正如您所說的,沒有必要)我正在尋找一些複雜的Xtext語法的很好的例子。對於ANTLR,你會發現許多流行的編程語言語法可以使用。對Xtext來說情況並非如此,所以我想知道是否有可能在Xtext中無縫編寫Java語法,因爲在其他論壇中,對於以前的Xtext版本,您深深地感到不鼓勵人們這樣做。 – 2011-04-12 10:01:39

+2

用Xtext實現的編程語言的最好例子是Xtend和Xbase。它的範圍已經完全實現,它支持完整的Java.generics和類Scala類型推斷。可以在這裏找到語法:http://goo.gl/QGR9d和http://goo.gl/7kl23 – 2011-04-12 12:05:41

+0

許多人多謝謝斯文!我會很好的看​​看它!這似乎是一個非常好的測試案例,用於在行動中使用Xtext。我讓你知道我的調查結果:) – 2011-04-17 21:01:32

3

我不能說什麼XTEXT或者是做得很好。

我可以開發強大的工具處理實語言的基礎上,我們與DMS Software Reengineering Toolkit,這是我們想象的體驗的問題講是一種語言操作框架。

首先,實際語言的解析由於這些語言的歷史發展方式,通常會牽扯到一些雜音和/或解析。 Java很乾淨。 C#具有與上下文相關的關鍵字和基本的類似C的預處理器。 C有一個完整的預處理器。由於語法和模板語法的模糊性,C++被稱爲「難以解析」。 COBOL相當難看,沒有任何參考語法,並且有各種方言。如果你看它,PHP會讓你變成石頭,因爲它定義的很差。 (DMS擁有所有這些解析器,用於真正應用程序的憤怒)。

然而,如果您嘗試足夠努力,通常會濫用詞法分析器或解析器來實現您的目標,您可以使用大多數可用的解析技術來解析所有這些問題(GNU團隊如何濫用Bison通過糾纏詞法分析來解析C++用符號表查找是一個很好的例子)。但是,爲了使語言細節正確無誤,參考手冊僅與編譯器真正接受的事實相近似。

如果Xtext有一個體面的解析引擎,可以用Xtext做這件事。仔細閱讀Xtext網站聽起來像詞法分析器和解析器是相當不錯的。我沒有看到有關「語義謂詞」的任何內容。我們在DMS中擁有它們,它們是解析過程中一些非常黑暗的角落中的救星。即使使用真正好的解析技術(我們使用GLR解析器),如果沒有解析COBOL數據聲明(在解析過程中提取它們的嵌套結構),將是非常困難的。

您有一個有趣的問題,因爲您的語言尚未定義好。這會使你的初始解析器有點混亂,你會修改它們很多。以下是強大的分析技術可以幫助您的地方:如果您可以輕鬆修改語法,則可以專注於您希望語言看起來像什麼,而不是專注於打擊詞法分析器和分析器。事實上,你可以改變你的語言定義意味着事實上,如果Xtext有一些限制,你可以彎曲你的語言語法以避免巨大的痛苦。 ANTLR確實有能力像您想像的那樣解析一種語言,模仿通常的解析器黑客攻擊量。

從來沒有討論過什麼是需要什麼來處理一個真正的語言。你需要做的第一件事就是構建AST,ANTLR和YACC將幫助你做;我認爲Xtext也是。您還需要符號表,控制和數據流分析(本地和全局)以及將您的語言轉換爲其他類型的機制(可能更具可執行性)。做符號表,你會發現令人驚訝的困難; C++有幾百頁「如何查找標識符」; Java泛型要比你想象的要更加困難。如果你想提供重構,你可能還想把AST打印回源代碼。 (編輯:這裏ANTLR和XText都提供了文本模板驅動的代碼生成)。

然而,這些都是複雜的機制,花費盡可能多的時間,如果不超過構建解析器。 DMS存在的原因並不是因爲它可以解析(我們認爲這只是撲克遊戲中的賭注),而是因爲所有這些其他東西都非常困難,我們想要分攤所有這些成本(DMS,我們認爲,對所有這些機制都有出色的支持,但YMMV)。

在閱讀Xtext概述時,聽起來他們對符號表有一些支持,但不清楚它背後有什麼樣的假設(例如,對於C++,您必須支持多重繼承和名稱空間)。

如果你已經開始了ANTLR的道路並且有東西在跑,我會很想留下課程;我懷疑Xtext是否會爲你提供很多額外的幫助。如果你確實需要Xtext的編輯器,那麼你可能會改變重構你的語法的代價(在改變解析範例時,這是一個相當典型的代價)。預計大部分工作將以特殊的方式出現在解析器正確之後。我懷疑你會發現Xtext或ANTLR在這裏有很大的不同。

+0

嗨艾拉非常感謝你的回覆。鏈接有誤,應該是http://www.semdesigns.com/products/DMS/DMSToolkit.html對不對?不過謝謝參考,我會給它看看。我知道我們將不得不面對你指出的所有問題,我們現在將這本書作爲參考http://pragprog.com/titles/tpdsl/language-implementation-patterns。即使你認爲ANLR和Xtext沒有那麼不同,我仍然想知道爲什麼我無法找到Java和其他語言的Xtext語法,比如ANTLR ... – 2011-04-12 09:10:11

+0

像往常一樣,很好的回答Ira!一個小小的挑剔:_「這裏ANTLR沒有提供AFAIK」_,ANTLR _does_支持使用[StringTemplate](http://www.stringtemplate.org/)發送文本/代碼。給定一個AST(或者只是一個簡單的分析樹),你可以使用ANTLR再次生成源代碼,而不必擔心縮進和其他手動的輸出操作。您必須創建自己的代碼模板並在ANTLR語法中混合自定義代碼,所以它不像1-2-3那麼容易,但仍然有可能。 (對於那些對此感興趣的人,Google for _「ANTLR輸出模板」_) – 2011-04-12 09:17:47

+0

@the_dark_destructor:有一件事,Xtext在表面上看起來相當新穎,需要時間來建立一個真正強大的語言定義庫。鑑於他們對Java的關注,我有點驚訝他們沒有完整的Java語法;鑑於其新穎性,其他人並不感到驚訝。 – 2011-04-12 09:32:35

0

我想你的問題最簡單的答案是:許多通用語言可以使用Xtext實現。但是由於通用語言所需的解析器功能沒有普遍的答案,所以對您的問題沒有一般的答案。

但是,我有幾個要點:

  • 用的Xtext 2.0(今年夏天發佈),支持的Xtext語法謂詞。如果不啓用antlr的回溯,這是處理歧義語法的最多要求的功能之一。

  • 你可能想看看全新的語言Xbase和Xtend,它們(根據它們的能力來判斷)是通用的,哪些是使用Xtext開發的。斯文有一些不錯的畫面投射在他的博客:http://blog.efftinge.de/

關於你的問題,爲什麼我們沒有看到的Xtext文法的Java,C++等: 用的Xtext,語言不僅僅是一個語法更,所以只要有一個描述語言語法的語法是一個很好的起點,但通常不是一件有價值的物品。原因在於,使用Xtext語法,您還可以定義AST的結構(實際上是抽象語法樹和Ecore模型),包括真正的交叉引用。由於這個模型是你的語言的主要內部API,所以人們通常會花很多心思來設計它。此外,要解析交叉引用(又名鏈接),您需要實現範圍設定(如在Xtext中調用)。如果沒有適當的範圍界定,你可能在你的模型中沒有真正的交叉引用,或者你會得到很多襯裏錯誤。

我猜我的觀點是,創建一個語法+設計AST模型+實施範圍確定只需要花費更多的精力從語言動物園獲取語法並將其轉換爲Xtext的語法。

心連心, 莫里茨

+1

「多一點」? – 2011-04-12 09:42:12

1

我一直在使用的Xtext了兩年,現在實行Umple語言(http://cruise.site.uottawa.ca/umple/)。 Umple是一種通用建模語言,允許開發人員嵌入其他高級編程語言(如Java和PhP)。所以,我需要Xtext來引用其他語言的語法(如Java)。我無法找到用Xtext編寫的java語法。交叉引用語法是一個很好的功能,但我不願意在xtext中重寫Java語法。任何想法或幫助表示讚賞。

+0

獲得一種工具可以解析嵌入另一個語言中的一種語言,而這種語言已經擁有的語法比獲得一個只解析一個你願意扭曲的語法的工具要困難得多。我們的DMS引擎執行此操作來支持源到源重寫規則,規則語法嵌入任意其他語法,並將其預定義到DMS。這就要求我們構建第二個解析引擎來處理相關問題。我不認爲你的問題真的是Java語法。 [我非常驚訝於無法爲ANTLR cum Xtext找到Java語法)。 – 2011-11-01 15:17:38