2009-04-01 15 views
2

私はtest.lを作成しました。これはflexに入力され、main関数で終わります。unputが間違っている

主な機能は以下のように実装されている場合:

int 
main(void) 
{ 
    yylex(); 
    return 0; 
} 

私は何の問題もありません。

は、私が最初の文字は必ずセミコロンであることを信じるようにパーサをだまししたいので、私は

int 
main(void) 
{ 
    unput(';'); 
    yylex(); 
    return 0; 
} 

セグメントの障害に上記リードとしてメイン実装しました。

なぜunputを使用するとセグメント・フォルトが発生しますか?

答えて

6

yylex()がunput()によって必要とされる入力バッファなどをまだ初期化していないため、セグメントの障害が発生しています。

これを先導するセミコロンに騙さずにスキャナを設計する方が良いでしょうが、これを行う必要がある場合は、開始条件を使用することが1つの解決策である可能性があります。このようなもの:

%x SPECIAL 
%% 
    BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */ 

<SPECIAL>. { unput(*yytext); unput(';'); BEGIN(INITIAL); } 

... rest of rules ... 
+0

ありがとうございました。私は初めに一度だけ走りたかったのですが、どうやってどのようにしたらいいのか分かりませんでした。今はトリックに頼る必要はありません。 –

0

以下のコードは意味が間違っていません。

int main(void) { unput(';'); yylex(); return 0; } 

問題はマクロunputを宣言し、もちろん、あなたが前にLEXを初期化しているはずフレックスから来ました。

.l fileの外部にメインを置くと、コードはセグメンテーションされません。

関連する問題