1

(-! comment !-)という1 つのトークンとして認識するフレックス ファイルを作成しようとしていますcomment。以下は私のファイルです:

%{
#include <stdio.h>

void showToken(char* name);
void error();
void enter();

int lineNum=1;
%}

%option yylineno
%option noyywrap

whitespace  ([\t ])
enter       ([\n])
startcomment (\(\-\!)
endcomment (\!\-\))
comment (^\!\-\))

%%

{startcomment}{comment}*{endcomment} showToken("COMMENT");
{enter} enter();
{whitespace}
.   error();

%%

void showToken(char* name){
    printf("%d %s %s %d% \n",lineNum,name, yytext); 
}

void enter(){
    lineNum++;
}

void error(){
printf("%d error %s \n",lineNum,yytext);
}

しかし、単純な(-! comment !-)入力では失敗します。このファイルは(-!andを認識しますが、ルール!-)を認識できません。commentに置き換えてみましたcomment (^{endcomment})が、うまくいきませんでした。何か提案はありますか?

4

1 に答える 1

2

^これは、次のパターンが一致してはならないことを意味しているように見えますが、行の先頭と一致していることを意味します。キャラクタークラスの内側はキャラクタークラス^以外のすべてを意味しますが、キャラクタークラスの外側ではその意味はまったく異なります。

代替案についてのあなたの質問に答えて。あなたの問題はCコメントに似てい/* comment */ます。次の式はCコメントと一致します。

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

または、より直感的に(必要に応じて)サブオートマトンを使用できます。

%x comment
%%
"/*"              { BEGIN(comment); }
<comment>(.|"\n") { /* Skip */ }
<comment>"*/"     { BEGIN(INITIAL); }
%%

これをコメントスタイルに適用するための演習として残しておきます。コメントの締めくくりとして、最初の解決策を!-)少し複雑にします。

一般に、2番目のソリューションは、大きなバッファーを使用しないため、推奨されることに注意してください。最初のソリューションは完全なコメント(大きくなる可能性があります)を含むバッファーを作成しますが、2番目のソリューションのバッファー要件は最大2文字です。

行番号を維持する最も簡単な方法は、%option yylinenoasflexを使用して、変数内の行番号を追跡することですint yylineno。または、の新行数を数えることもできますyytext。2番目のソリューションでは、2番目のルールを分割し、別のケースを作成して、"\n"そこで行番号をカウントできます。

于 2013-03-24T03:37:25.587 に答える