2017-03-07 11 views
0

ANTLRでは、ANTLRErrorListenerを実装することにより、ANTLR 4のエラー/例外処理を拡張できます。それは、レクサーとパーサーを使って作成されたツリーをたどるときだけ、イベントが発生します。例: ANTLR 4リスナー・イベントをトリガーする前に事前にエラーと例外を処理する

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); // Can be replaced by default Base listener(empty implementation) 
walker.walk(listener, parser.test()); // At this line tree will be traversed and if any error then MyTryDSLErrorListener's callback will be called. 

私はリスナー/ビジターを起動せずに入力 文字列からエラーを取得する任意のきれいな方法があるかどうかを知りたいです。

注:デフォルトの実装でリスナーを置き換えることによって、これを処理する方法がありますが。そして再び、以下のようにのように、独自の実装リスナーにツリーをトラバース:

walker.walk(new TryDSLBaseListener(), parser.test()); // Find if has any errors. 
walker.walk(new MyTryDSLListener(), parser.test()); // Actual use case. 

答えて

0

ANTLRErrorListenerは解析中でインラインパーサで発生したエラーを報告します。つまり、リスナーは、パーサーが文法の開始ルールを実行した結果として発生した構文エラーを報告します。

リスナーはパーズツリーウォーク操作に参加していません。

更新

parser.removeErrorListeners(); 
parser.addErrorListener(new MyTryDSLErrorListener()); 
ParseTree tree = parser.test(); 

解析ツリーを作成するパーサの実行を開始parser.test()を呼び出します。実行中、パーサーがエラーを検出すると、パーサーはパーサーに登録されているANTLRErrorListenerを介してエラーを報告します。このようなエラーはすべて、parser.test()が返されたときに報告されます。

この時点で、解析ツリーが構築されています。歩くことは木の建設とはまったく別物です。登録されたパーサANTLRErrorListenerは呼び出されません。

ParseTreeWalker walker = new ParseTreeWalker(); 
MyTryDSLListener listener = new MyTryDSLListener(); 
walker.walk(listener, tree); 
+0

解析中にパーサーをインラインで詳しく説明できますか?可能であれば、私にチュートリアルを提供してください。私がそれを理解していれば、それを 'parser.test();'に変更すべきですか?リスナーを加えて木を歩く? –

関連する問題