3

私はLua grammarを持っています (C# 用に出力するためのマイナーな変更、名前空間ディレクティブといくつかのオプションの変更のみ) をいくつかのサンプル入力で実行すると、ルート「nil」ノードを持つツリーが返されます子として、入力コードのトークン化されたバージョンのように見えます。ANTLRのツリー文法は「フラット」ツリーではなく階層ツリーで動作するように見えるため、出力をそのまま使用できるとは思いません。

文法の簡単な修正はありますか、それとも最初から書き直す必要がありますか?

4

1 に答える 1

6

ツリーがノードの 1 次元リストであると仮定すると、親/兄弟階層を作成する方法は次のとおりです。

ANTLR には、AST 作成用の 2 つのオペレーターがあります。

!     excludes the node (token) from the (sub)tree;
^     makes a node the root of a (sub)tree.

演算子が指定されていない場合、ノード/トークンは現在のルートの子として追加されます。これはおそらくあなたに起こったことです: あなたが見るのは、ノード/トークンの 1 次元のリストだけです。

例:

grammar Exp;

options {output=AST;}

// ... some rules ...

addition
  :  Integer '+'^ Integer ';'!
  ;

Integer
  :  '0'
  |  '1'..'9' '0'..'9'*
  ;

このadditionルールは、次の式のツリーを作成します6+9;

   +
  / \
 /   \
6     9

ご覧のとおり、the+はルート (^後に a があります)、数字はトークン (演算子はありません) であり、セミコロンは除外されています (!後に a があります)。

詳細な説明については、The Definitive ANTLR Reference の Chapter 7, Tree Construction を参照してください。コピーを入手することを強くお勧めします。

ゼロから始めるかどうかは、あなたが決めることです。空の文法ファイルから始めて、徐々にルールを追加し、頻繁にチェックして、すべてが機能するかどうかを確認します。既存の文法にツリー演算子を散りばめるだけでは、デバッグがかなり難しい場合があります。特に、ANTLR にあまり慣れていない場合はなおさらです。

頑張ってください!

于 2009-12-23T19:04:41.880 に答える