2

背景: ANTLR 文法を作成しました。ANTLRWorks を使用してテストとデバッグを行うことができ、パーサーが思い描いていた AST を作成することを確認しました。ここで、AST 用のツリー文法を作成し、ツリーを解析して、ANTLRWorks を使用してツリー文法をデバッグしたいと考えています。

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

PS で質問/回答を調べました ANTLRWorks でツリー文法をデバッグする方法を知っている人はいますが、私の質問には答えません。OPに受け入れられましたが、彼は同様のコメントをしました。

4

1 に答える 1

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で両方の文法を開き、最初に+ +をASTDemo.g押してレクサーとパーサーを生成し、次にを開いて++を押してツリーウォーカーを生成します。CTRLSHIFTGASTDemoWalker.gCTRLSHIFTG

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

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

を押しOKます。

これで、デバッグプロセスをステップ実行でき、最後に、パーサーが生成したASTの両方を確認できます。

ここに画像の説明を入力してください

そして、ツリーウォーカーがどのようにASTの上を歩いたか:

ここに画像の説明を入力してください

たとえば、ツリーの文法で「偶発的な」間違いを犯した場合は、^('*' expression expression)を定義する代わりに^('*' expression)42ツリー文法を再度デバッグすると、ノードを通過した後に失敗することがわかります。

ここに画像の説明を入力してください

ASTでは、ノードの後に​​別のノードがあり42ますが、ツリーウォーカーはルートノード42の後に​​1つの単一ノード()のみを予期していました。*

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

于 2012-01-19T22:32:34.677 に答える