前のルールが受け入れないものを受け入れるパーサールールを作成するにはどうすればよいですか?以前に一致しなかったものを受け入れるための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を好むようです。
私の前提は正しいですか?この種の無視ロジックを実装する正しい方法ですか?
これはまさに私が知りたいことです。 #if #ifndefなどを除外し、それ以外はすべて含むパーサールールを作成するにはどうすればよいですか? – JavaMan
ANTLRが 'preprocessorLineSet'より' oneNormalInputLine'を好むように見える作業文法を投稿できますか? –
私は文法のバグだと思う。さらにテストすると、最初の選択肢(preprocessorLineSet)が正しく検索されます。 #ifを除外しないキャッチオールルールによるバグです(preprocessorLineSetは一致していますが、実際には一致するoneNormalInputLineです)。私はどのように特定のパターンを除外するいくつかのルールを書くことが可能ですか? – JavaMan