2

flexへの入力であるtest.lを作成しました。これは、main関数で終了します。

main関数が次のように実装されている場合:

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

問題はありません。

パーサーをだまして、最初の文字が常にセミコロンであると信じ込ませたいので、mainを次のように実装しました。

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

上記はセグメンテーション違反につながります。

unputを使用すると、セグメンテーション違反が発生するのはなぜですか?

4

2 に答える 2

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 ...
于 2009-04-01T06:27:44.097 に答える
0

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

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

問題は、マクロを宣言した flex にunputあり、もちろん、以前に lex を初期化する必要がありました。

しかし、メインを の外に置くと.l file、コードは segfault しません。

于 2010-07-16T03:56:07.473 に答える