2011-10-28 5 views
0

前のルールが受け入れないものを受け入れるパーサールールを作成するにはどうすればよいですか?以前に一致しなかったものを受け入れるためのANTLRルール

私がやっていることは、C++ srcファイルをANTLRで書き直そうとしていることです。私の文法は、C++の部分集合を理解し、残りの部分を無視するだけです。残りの部分を無視することによって、入力行をそのまま出力する必要があることを意味します。私は単に入力を落とすことはできません。たとえば、#if、#ifdef、#ifndef、#else、#elif、#endifの位置を特定する必要がありますが、それ以外の有効なC++構文をそのまま出力に戻す必要があります。私は、パーサーは文法に記載されている順に選択肢をしようとするだろうと仮定しています

inputLines : (preprocessorLineSet | oneNormalInputLine) ; 
preprocessorLineSet : ....;// pattern to match #if #else etc 
oneNormalInputLine : (any_token_except_crlf)* CRLF {System.out.println($text)}; 
// a catch-all rule for anything including #if #else #endif, it must send any unrecognised input back to the ouput 

:のように私の解決策の

一部が見えます。だから私のpreprocessorLineSetルールは1NormalInputLineinputLinesルールの前にリストされています。しかし、ANTLRはまだ入力が#ifパターンであっても前のルールと一致していると仮定しても、oneNormalInputLineを好むようです。

私の前提は正しいですか?この種の無視ロジックを実装する正しい方法ですか?

答えて

1

JavaManは書いた:

を、私は、パーサーは文法に記載されている順に選択肢をしようとするだろうと仮定しています。ですから、私のpreprocessorLineSetルールは、inputLinesルールのoneNormalInputLineの前にリストされています。

正しいかどうかは、左から右(preprocessorLineSetoneNormalInputLineの前)です。

JavaManは書きました:ANTLRはまだ入力が、私は以前の規則にマッチしなければならないと仮定する#ifパターンの場合でもoneNormalInputLineを好むようにそれはそう、

をしかし。

#if#elifのようなものをany_token_except_crlfから除外する必要はありませんか?予期しない動作を示すドライバクラスを含む実際のサンプルを投稿できますか?

+0

これはまさに私が知りたいことです。 #if #ifndefなどを除外し、それ以外はすべて含むパーサールールを作成するにはどうすればよいですか? – JavaMan

+0

ANTLRが 'preprocessorLineSet'より' oneNormalInputLine'を好むように見える作業文法を投稿できますか? –

+0

私は文法のバグだと思う。さらにテストすると、最初の選択肢(preprocessorLineSet)が正しく検索されます。 #ifを除外しないキャッチオールルールによるバグです(preprocessorLineSetは一致していますが、実際には一致するoneNormalInputLineです)。私はどのように特定のパターンを除外するいくつかのルールを書くことが可能ですか? – JavaMan

関連する問題