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 を照合できます。