6

ANLTR4 lexer で Perl の正規表現 ^ と $ を実現するには? すなわち。文字を消費せずに行頭と行末を一致させます。

ANTLR4 lexer を使用して、行の途中ではなく行頭の # 文字に一致させようとしています。文字列リテラル。(通常、C++ 文字列リテラルをトークン化して、行の途中に表示される # を削除できますが、それを行っていないと仮定します)。# .*? だけを指定したいということです。#if #ifndef #pragma などを気にせずに

また、C++ 標準では、# の前後に空白と複数行のコメントが許可されています。

   /* helo
world*/  #  /* hel
l
o
*/  /*world */ifdef .....

は、1 行に表示される有効なプリプロセッサ ディレクティブと見なされます。(ML COMMENT 内の CRLF は破棄されます)

これは私が現在やっていることです:

PPLINE: '\r'? '\n' (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+ -> channel(PPDIR); 

しかし、問題は、# の前に CRLF が存在することに依存し、その CRLF をディレクティブと一緒に捨てなければならないことです。このディレクティブ行の CRLF によって破棄された CRLF を置き換える必要があるため、ディレクティブが CRLF で終了していることを確認する必要があります。

ただし、これは、私の文法が、ファイルの先頭に表示されるディレクティブ (つまり、先行する CRLF がない)、または CRLF を終了せずに EOF が先行するディレクティブを処理できないことを意味します。

Perl スタイルの正規表現 ^ $ 構文が使用できる場合、CRLF を明示的に照合して使用する代わりに、SOL/EOL を照合できます。

4

2 に答える 2

1

ゲートされたセマンティクス (異なる状態の異なるレクサー ルール) またはモード (pushMode -> http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules ) を使用して複数のルールを作成し、代替ルールを使用することができます。ファイルの先頭に移動し、ディレクティブが終了したときにコア ルールに切り替えますが、これは長い作業になる可能性があります。

まず、おそらく、何も変更せずに #pragma/preprocessor ディレクティブを解析する際に問題があるかどうかを試してみます。適切な大文字と小文字を区別できるはずです (ただし、これは、コメントにディレクティブを入れることができる言語では問題になる可能性があります)。

于 2013-05-05T10:47:05.477 に答える