2012-01-19 9 views
2

背景:ANTLR文法を作成しました。私はANTLRWorksを使ってテストしてデバッグすることができ、パーサーが私の心に持っていたASTを作成することを確認しました。ここでは、ASTのツリー文法を記述し、ツリーを解析し、ANTLRWorksを使用してツリー文法をデバッグします。ANTLRWorksでツリー文法をテストするためのAST入力を作成/指定する方法は?

質問:ANTLRWorksを使用してツリー文法をテストしてデバッグしたいとします。私はパーサによって作成されたASTを解析する必要があります。 ANTLRWorksでツリー文法をテストする際に、ASTを入力としてどのように指定するのですか?

P. 私はDoes anyone know of a way to debug tree grammars in ANTLRWorksで質問/回答を研究しましたが、私の質問には答えません。 OPによって受け入れられたが、彼は同様のコメントをした。

答えて

3

ANTLRWorksでツリー文法をテストするときにASTを入力として指定する方法を教えてください。

ASTを提供する必要はありませんが、ASTを作成するパーサーのみを指定する必要はありません。

はASTを生成し、次の文法を考える:

grammar ASTDemo; 

options { 
    output=AST; 
} 

tokens { 
    ROOT; 
    U_MIN; 
} 

parse 
: expression EOF -> ^(ROOT expression) 
; 

expression 
: addition 
; 

addition 
: multiplication (('+' | '-')^ multiplication)* 
; 

multiplication 
: unary (('*' | '/')^ unary)* 
; 

unary 
: '-' atom -> ^(U_MIN atom) 
| atom 
; 

atom 
: ID 
| NUMBER 
| '(' expression ')' -> expression 
; 

ID  : ('a'..'z' | 'A'..'Z')+; 
NUMBER : '0'..'9'+ ('.' '0'..'9'*)?; 
SPACE : (' ' | '\t' | '\r' | '\n')+ {skip();}; 

上の文法によって生成さASTのツリー文法になり、次の

tree grammar ASTDemoWalker; 

options { 
    output=AST; 
    tokenVocab=ASTDemo; 
    ASTLabelType=CommonTree; 
} 

parse 
: ^(ROOT expression) 
; 

expression 
: ^('+' expression expression) 
| ^('-' expression expression) 
| ^('*' expression expression) 
| ^('/' expression expression) 
| ^(U_MIN expression) 
| atom 
; 

atom 
: ID 
| NUMBER 
; 

ASTDemo.gASTDemoWalker.gの両方を置くことを確認してください同じフォルダにあります。 ANTLRWorksの両方文法を開き、ASTDemoWalker.gを開き、CTRL + SHIFT + Gを押してツリーウォーカーを生成その後CTRL + SHIFT + Gを押すことによって第ASTDemo.gからレクサー&パーサを生成します。

は今、ASTDemoWalker.gエディタパネルから、CTRL + Dを押してデバッガを起動し、テキスト領域に次のソースを貼り付けます。

42 * ((a + 3)/-3.14) 

OKを押してください。

これで、デバッグプロセスをステップすることができ、最後に、あなたは、生成されたパーザASTの両方何を参照することができます。

enter image description here

とどのようにウォーカーが歩いツリーがASTを言った:

enter image description here

あなたが今、ツリー文法における「偶然の」ミスをした場合、あなたは^('*' expression)を定義する代わりに^('*' expression expression)の、と言います。(ツリーウォーカーは期待しながら、42ノードの後に​​別のノードがあるASTで

enter image description here

のみ1つのノードを:あなたは再び木文法をデバッグする場合、あなたはそれが42ノードを通過した後に失敗が表示されます42)をルートノードの後ろに置きます。

もちろん、これは簡単な文法ですが、ANTLRに精通していても、@ $ &の痛みがあり、ツリー文法のエラーを追跡することがあります。 :)

+0

あなたの貴重なヘルプ@Bart Kiersのおかげで、私はANTLRWorksの文法とツリー文法の両方で作業することを考えました。 - 真面目、あなたがまだ始まっていないなら、あなたはANTLRに関する本を書くべきです。 –

+0

おかげさまで@ ndroock1、あなたはもちろん歓迎です。いいえ、私は本を始めることはありません:)私はしばらくブログを貼りつづけて、SOの質問に答えると思います。 –

関連する問題