私はLua grammarを持っています (C# 用に出力するためのマイナーな変更、名前空間ディレクティブといくつかのオプションの変更のみ) をいくつかのサンプル入力で実行すると、ルート「nil」ノードを持つツリーが返されます子として、入力コードのトークン化されたバージョンのように見えます。ANTLRのツリー文法は「フラット」ツリーではなく階層ツリーで動作するように見えるため、出力をそのまま使用できるとは思いません。
文法の簡単な修正はありますか、それとも最初から書き直す必要がありますか?
私はLua grammarを持っています (C# 用に出力するためのマイナーな変更、名前空間ディレクティブといくつかのオプションの変更のみ) をいくつかのサンプル入力で実行すると、ルート「nil」ノードを持つツリーが返されます子として、入力コードのトークン化されたバージョンのように見えます。ANTLRのツリー文法は「フラット」ツリーではなく階層ツリーで動作するように見えるため、出力をそのまま使用できるとは思いません。
文法の簡単な修正はありますか、それとも最初から書き直す必要がありますか?
ツリーがノードの 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 にあまり慣れていない場合はなおさらです。
頑張ってください!