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 オブジェクト グラフの作成を可能な限り自動化したいと考えています。
ヒントはありますか?