0

ac ファイルからコメントを取り出そうとしています。しかし、私のコードは、/* と */ だけでなく、すべての星を引き出します。誰でも助けることができますか?

入力 /**A**/または/***/

望ましい出力*A**

私の出力*Aと何もない

コード

"/*"    /* comment */ BEGIN(Comment);
<Comment>{
    [^*]         /* not a '*' */ ECHO;
    "*"+[^/]      /* '*'s not followed by '/' */ ECHO;
    "*"+"/"       /* end of Comment */ BEGIN(INITIAL);
}
4

2 に答える 2

0

この正規表現は、ネストされていない C コメントと一致します。

"/*"([^*]|[*]*[^*/])*"*"+"/"

以下は、入力から C コメントを取り除き、各コメントをスペースに置き換える完全な Lex プログラムです。

%%

"/*"([^*]|[*]*[^*/])*"*"+"/" putc(' ', yyout);

%%      

ただし、これでは有用な診断は提供されません。たとえば、次/* /* */のようなことが発生した場合、コメント内の疑わしいコメントの開始について警告を生成すると便利です。また、コメントが終了していない場合は、それを検出し、その診断が開始されたかどうかについての診断を生成すると便利です。

これらの理由から、シーケンスのみを認識してから、ストリームから文字を読み取り、コメントの残りを認識する/*カスタム コードを引き継いで、 C コメントを処理するのが最善の場合があります。yyin

于 2013-04-16T23:54:18.713 に答える