2

AST を設定する文法ファイル (BNF/BNF のようなもの) からパーサーを生成する方法を探しています。ただし、開発者が読み取り可能な方法でさまざまな AST クラスを自動的に生成することも検討しています。

例: 次の文法ファイルの場合

expressions = expression+;
expression = CONST | math_expression;
math_expression = add_expression | substract_expression;
add_expression = expression PLUS expression;
substract_expression = expression MINUS expression;

CONST: ('0'..'9')+;
PLUS: '+';
MINUS: '-';    

次のJavaクラスを生成したいと思います(フィールドの例を示します):

class Expressions {List<Expression> expression};
class Expression {String const; MathExpression mathExpression;} //only one should be filled.
class MathExpression {AddExpression addExpression; SubstractExpression substractExpression;}
class AddExpression {Expression expression1; Expression expression2;}
class SubstractExpression {Expression expression1; Expression expression2;}

そして、実行時に、AST を表す次のオブジェクト グラフを生成する式「1+1-2」が必要です。

Expressions(Expression(MathExpression(AddExpression(1, SubstractExpression(1, 2)))))

(演算子の優先順位は気にしないでください)。

私は DSL パーサー ジェネレーター (JavaCC/ANTLR とその仲間) を調べてきましたが、見つけた最も近いものは、ANTLR を使用して "enterExpression" と "leaveExpression" スタイルのメソッドでリスナー クラスを生成することでした。"multi" を使用して JavaCC と jjtree を使用して生成されたやや似たコードを見つけましたが、非常に扱いにくく、使いにくいものです。

私の文法ニーズはいくぶん単純なものであり、AST オブジェクト グラフの作成を可能な限り自動化したいと考えています。

ヒントはありますか?

4

1 に答える 1

3

DSL 構築の多くのサポートが必要な場合、ANTLR と JavaCC はおそらく適していません。それらは解析を提供し、ツリーを構築するためのサポートを提供します...そしてその後はあなた自身です。しかし、お気づきのように、独自のツリーを設計し、詳細を検討するには多くの作業が必要であり、その時点で DSL を使用することはほとんどありません。あなたはまだそれを使用することはできません。

JetBrains MPS、Xtext、Spoofax、DMS など、より完全なソリューションがあります。それらはすべて、DSL を定義し、それを内部形式に変換 (「ツリーの構築」) し、コード生成のサポートを提供する方法を提供します。最初の 3 つは IDE サポートが統合されており、「小さな」DSL を対象としています。DMS は処理しませんが、C++ のような実際の言語や DSL を処理します。最初の 3 つはオープン ソースだと思います。DMS は商用です (私は DMS の背後にいる当事者です)。

Markus Voelter がDSL Engineeringに関するオンライン ブックをリリースしました。彼は MPS、XText、Spoofax について詳しく説明していますが、DMS については詳しく説明していません。彼はあなたが何を知る必要があるか、何をする必要があるかを教えてくれます。私の本の流れに基づいて、それはかなり広範です。あなたはおそらく「単純」で降りるつもりはありません。DSL には多くのセマンティックな複雑さがあり、それをサポートする機構は困難です。

私は著者を知っており、この分野での彼のスキルに大きな敬意を払っており、おいしいビールを飲みながら、技術的な夏のスキルについて彼と一緒に講義しました. そうでなければ、私はこの本をすることは何もありません。

于 2013-01-28T01:46:32.107 に答える