19

私は現在、汎用のエージェントベースのプログラミング言語を開発しています (その構文は Java に多少影響を受けており、この言語でもオブジェクトを使用しています)。

プロジェクトの開始以来、私たちはANTLRまたはXtextを使用するという事実について疑問を抱いていました。その時点で、Xtext が ANTLR の機能のサブセットを実装していることがわかりました。そのため、言語に ANLTR を使用することにしましたが、言語に本格的な Eclipse エディターを無料で提供する可能性を失いました (Xtext が提供する優れた機能)。

しかし、私の知る限りでは、この夏、Xtext プロジェクトは大きな前進を遂げました。リンクから引用:

Xtext の制限事項は何ですか?

Sven: Xtext を使用すると、ほぼすべての種類のプログラミング言語または DSL を実装できます。例外が 1 つあります。それは、いわゆる「セマンティック述語」を使用する必要がある場合です。これはかなり複雑で、ここで説明する価値はないと思います。この概念を本当に必要とする言語はほとんどありません。ただし、顕著な例は C/C++ です。次のリリースでは、そのトピックについて検討したいと考えています。

そして、それはXtextのドキュメントでも強化されています:

Xtextとは何ですか?小さなテキストのドメイン固有言語 (DSL) を作成したい場合でも、本格的な汎用プログラミング言語を実装したい場合でも構いません。Xtext を使用すると、独自の言語を簡単に作成できます。また、既に既存の言語を持っていても適切なツール サポートが不足している場合、Xtext を使用して、最新の Java IDE で知られている編集エクスペリエンスを驚くほど短時間で提供する洗練された Eclipse ベースの開発環境を作成できます。Xtext を言語開発フレームワークと呼びます。

Xtext が過去の制限を取り除いたのなら、最もよく知られているプログラミング言語 (Java、C# など) の複雑な Xtext 文法をまだ見つけられないのはなぜですか?

ANTLR の Web サイトでは、そのような文法の例をたくさん見つけることができます。代わりに、Xtext に関係するものについては、ドキュメントで報告されているものだけを見つけることができました。では、Xtext は汎用プログラミング言語の実装に使用するにはまだ成熟していないのでしょうか? 私はこれについて少し心配しています...私はXtextで文法を書き直して、それがそれに適していないことを認識しませんでした.

4

3 に答える 3

16

Java や C++ を実装した人は誰もいなかったと思います。なぜなら、それは (Xtext を使っても) 大変な作業であり、既存のツールとコンパイラは優れているからです。ただし、Xtext に同梱されている式言語である Xbase と Xtend を見ることができます。これは 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 式を言語に簡単に埋め込むことができることに注意してください。

于 2011-04-12T09:22:49.587 に答える
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 には、通常のパーサー ハッキングの量を法として、想像どおりに言語を解析する実証済みの機能があります。

議論されていないのは、言語を実際に処理するために他に何が必要かということです。最初に行う必要があるのは、ANTLR と YACC が支援する AST を構築することです。Xtextもそうだと思います。また、シンボル テーブル、制御とデータ フローの分析 (ローカルとグローバルの両方)、言語を別のもの (おそらくより実行可能) に変換する機械も必要です。シンボル テーブルだけを実行すると、驚くほど難しいことがわかります。C++ には「識別子の検索方法」が数百ページあります。Java ジェネリックを正しく理解するのは、予想よりもはるかに困難です。リファクタリングを提供したい場合は、AST をソース コードにプリティプリントすることもできます。(編集: ここでは、ANTLR と Xtext の両方が、テキスト テンプレート駆動型のコード生成に相当するものを提供します)。

しかし、これらは複雑なメカニズムであり、パーサーの構築と同じくらいの時間がかかります。DMS が存在する理由は、解析できるからではなく (これはポーカー ゲームのアンティと見なされます)、他のすべてのものは非常に難しく、すべてを実行するためのコストを償却したかったからです (DMS は、 YMMV を除くこれらすべてのメカニズムの優れたサポートと考えています)。

Xtext の概要を読むと、シンボル テーブルをサポートしているように見えますが、その背後にある前提が不明です (たとえば、C++ の場合、複数の継承と名前空間をサポートする必要があります)。

あなたがすでに ANTLR の道を歩み始めていて、何かを実行しているなら、私はコースにとどまりたいと思うでしょう。Xtext が追加のヘルプを提供してくれるかどうかは疑問です。Xtext のエディターが本当に必要な場合は、使用している文法を再構築するという代償を払って切り替えることができます (これは、構文解析のパラダイムを変更するときに支払う典型的な代償です)。パーサーを適切に取得した後、その場しのぎの方法でほとんどの作業が表示されることを期待してください。ここで Xtext や ANTLR が大きく異なることに気付くとは思いません。

于 2011-04-12T08:40:25.893 に答える
0

あなたの質問に対する最も簡単な答えは、次のとおりだと思います。多くの汎用言語は、Xtext を使用して実装できます。しかし、汎用言語が必要とするパーサー機能に対する一般的な答えがないため、質問に対する一般的な答えはありません。

ただし、いくつかの指針があります。

  • Xtext 2.0 (今年の夏にリリース) では、Xtext は構文述語をサポートします。これは、antlr のバックトラッキングを有効にすることなく、あいまいな構文を処理するために最も要求された機能の 1 つです。

  • Xtext を使用して開発された、(機能に基づいて判断すると) 汎用である、まったく新しい言語 Xbase および Xtend を見てみることをお勧めします。Sven は彼のブログに素敵なスクリーン キャストを掲載しています: http://blog.efftinge.de/

なぜ Java や C++ などの Xtext 文法が表示されないのかという質問について: Xtext では、言語は単なる文法以上のものであるため、言語の構文を記述する文法を持つことは良い出発点ですが、通常はそうではありません。出荷するのに十分な価値のあるアーティファクト。その理由は、Xtext-grammar では、真の相互参照を含む AST の構造 (抽象構文ツリー、および実際には Ecore モデル) も定義するためです。このモデルは言語の主要な内部 API であるため、人々は通常、その設計に多くの時間を費やします。さらに、相互参照 (別名リンク) を解決するには、スコープ (Xtext で呼び出される) を実装する必要があります。スコーピングを適切に実装しないと、モデルに真の相互参照がないか、多くのライニング エラーが発生します。

私の要点は、文法の作成 + AST モデルの設計 + スコーピングの実装は、いくつかの言語動物園から文法を取得してそれを Xtext の構文に翻訳するよりも少し手間がかかるということです。

于 2011-04-12T09:37:21.583 に答える