1
単純なDSL用のインタプリタを作成し、if-then-elseエバリュエーターをエレガントに実装する方法を考えています。私はantlr.orgからオンラインで1つの例を見つけましたが、実際には保護されているCommonTreeNodeStreamのgetNodeIndex()を使用しています。私は何ができる最高は以下の通りであった:これは働いているAntlr V3ツリーパーサーを使ってif-then-elseエバリュエーターを生成する
ifblock
@init
{
int t = 0;
int f = 0;
}
@after
{
if(c)
stream.push(t);
else
stream.push(f);
statements(); // handle the statements in then or else branch
stream.pop()
}
: ^(IF c=condition {t = input.mark();}. {f = input.mark();}.)
;
が、私は何とか本当に満足していません。より良い方法がありますか?
ありがとうございます。私は実際にビジターパターンを使用して自分の評価を書いていますが、実際に可能かどうかを確かめるために、ツリー文法を使うことに決めました。私は賛否両論を今より明確に見ることができます。 「Xを正しく行う方法」の多くは厳しいルールではなく、慣習であり、Antlrでそれを学ぶ必要がありました:) – ntrolls