Javaで自然なDSLを作成するための最良のツールは何でしょうか?

StackOverflow https://stackoverflow.com/questions/144339

  •  02-07-2019
  •  | 
  •  

質問

数日前、ブログエントリを読みました( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx )で、一般的な自然のアイデアについて議論します.NETを使用した言語DSLパーサー。

彼の考えの素晴らしい部分は、私の意見では、テキストが解析され、文と同じ名前を使用してクラスと照合されるということです。

例として、次の行:

Create user user1 with email test@email.com and password test
Log user1 in
Take user1 to category t-shirts
Make user1 add item Flower T-Shirt to cart
Take user1 to checkout

" known"のコレクションを使用して変換されます。解析の結果を取得するオブジェクト。いくつかのサンプルオブジェクトは次のようになります(私の例ではJavaを使用):

public class CreateUser {
    private final String user;
    private String email;
    private String password;

    public CreateUser(String user) {
    this.user = user;
    }

    public void withEmail(String email) {
    this.email = email;
    }

    public String andPassword(String password) {
        this.password = password;
    }
}

したがって、最初の文を処理するとき、CreateUserクラスは一致し(明らかに「ユーザーの作成」の連結であるため)、コンストラクターのパラメーターを取得するため、パーサーは「user1」を取得します。ユーザーパラメータとして。

その後、パーサーは次の部分を「メールで」と特定します。メソッド名にも一致し、そのメソッドはパラメーターを受け取るため、" test@email.com"を解析します。メールパラメータとして。

今までにアイデアを得たと思いますか?少なくとも私にとっては、アプリケーションテスト担当者が「テストスクリプト」を作成できるようにすることは、非常に明確なアプリケーションです。自然言語で記述し、JUnitを使用してアプリの動作をチェックするクラスに文を解析します。

Javaを使用してそのようなパーサーをコーディングできるツールまたはリソースに関するアイデア、ヒント、意見を聞きたいです。複雑なレクサーやANTLRのようなフレームワークの使用を避けることができれば、さらに良いでしょう。ハンマーを使ってハエを殺すのではないかと思います。

それ以上に、もし誰かがそのためのオープンソースプロジェクトを始めるつもりなら、私は間違いなく興味があるでしょう。

役に立ちましたか?

解決

字句解析と構文解析の複雑さを考えると、それらすべてを手作業でコーディングしたいかどうかはわかりません。 ANTLR をピックアップするのはそれほど難しくなく、問題に基づいて検討する価値があると思います。 構文解析文法を使用して、入力から構文ツリーを構築および抽象化する場合、そのASTをツリー文法で簡単に処理できます。ツリーの文法は、説明したプロセスの実行を簡単に処理できます。

最初に、Eclipse、Groovy、Grailsなどの多くの場所でANTLRを見つけます。 決定的なANTLRリファレンスは、かなり迅速。

今年初めに、ユーザーが生成したクエリテキストを処理する必要があるプロジェクトがありました。私はそれを手動で処理する道を歩み始めましたが、すぐに圧倒されました。 ANTLRの速度を上げるのに数日かかり、数日で文法とプロセッサの初期バージョンを実行しました。要件へのその後の変更と調整により、カスタムバージョンはすべて無効になりますが、ANTLR文法を実行してから調整するのに比較的労力はほとんど必要ありませんでした。

がんばって!

他のヒント

「自然言語」と呼ぶなら、あなたは自分を欺いています。それはまだプログラミング言語であり、自然言語を模倣しようとするものにすぎません-実装の詳細に入ると失敗するのではないかと思います。明確にするために、「英語」を書いていると思わせたユーザーを混乱させる構文に制限を設ける必要があります。

DSLの利点は、(とにかくそうであるべきです)シンプルかつ明確でありながら、問題領域に関して強力であることです。自然言語を模倣することは二次的な関心事であり、実際にはこれらの主要な目標に逆効果になる可能性があります。

誰かが愚かすぎるか、プログラミングに必要な正式な厳密な思考能力に欠けている場合、自然な言語を模倣するプログラミング言語は魔法のようにそれらをプログラマーに変えることはありません。

COBOLが発明されたとき、一部の人々は、COBOLは「英語のような」ものであり、ソフトウェアを必要とする人なら誰でもそれを書くことができるため、10年以内にプロのプログラマーに対する需要はゼロになると真剣に信じていました。そして、私たちは皆、それがどのように機能しているかを知っています。

Xtext を検討することをお勧めします。これは、ANTLRを内部的に使用し、自動生成などの便利な機能を実行しますDSLのエディター。

DSLを初めて聞いたのは、IntellJ Ideaの作成者であるJetbrainsからでした。

次のツールがあります: MPS(Meta Programming System)

Antlrを使用して行ったこのマルチパートブログシリーズは、出発点として役立つことがあります。 Antlr 2を使用しているため、Antlr 3では一部のものが異なります。

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

Mark VolkmanのAntlrに関するプレゼンテーション/記事も非常に役立ちます:

http://www.ociweb.com/mark/programming/ANTLR3.html

第2のDefinitive ANTLR本についての提案は、これも優れています。

"少なくとも私にとっては、アプリケーションテスターが「テストスクリプト」を作成できるようにすることは非常に明確です。自然言語で記述し、JUnitを使用してアプリの動作をチェックするクラスに文を解析します

ここで話していることは、ツールのFitNesseとまったく同じです。 あなたが説明したとおり、クライアントは受け入れテスト「スクリプト」を書きます。彼らにとって理にかなっているある種の言語で、プログラマはテストに合格するシステムを構築します。あなたが話している実装でさえ、FitNesseの機能とほぼ同じです-スクリプトで使用される語彙は関数名などを形成するために連結されているため、FitNesseフレームワークは呼び出す関数を認識します。

とにかく、チェックしてください:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top