0

次のコードを含むlexファイルport_regex.lがあります。

DECIMAL_16bits [ \t]*[:digit:]{1,4}[ \t]*
SPACE [ \t]

%x S_rule S_dst_port

%%

%{
    BEGIN S_rule;
%}

<S_rule>(dst-port){SPACE}   {
           BEGIN(S_dst_port);
        }

<S_dst_port>\{{DECIMAL_16bits}\}  {
       printf("\n\nMATCH [%s]\n\n", yytext);
       BEGIN S_rule;
     }

. { ECHO; }

%%

int main(void)
{
    while (yylex() != 0)
        ;
    return(0);
}

int yywrap(void)
{
    return 1;
}

それから次のように実行可能ファイルを作成します。

flex port_regex.l
gcc lex.yy.c -o port_regex

これにより、port_regexという実行可能ファイルが作成されます。

以下に示すport.fileというテストデータを含むファイルがあります。

dst-port {234}
dst-port {236}
dst-port {233}
dst-port {2656}

port_regex実行可能ファイルを使用してport.fileをテストするにはどうすればよいですか。

私は次のようなことをすることができますか

./port_regex <port.file

上記を試してみましたが、うまくいかないようですが??

4

1 に答える 1

1

アプリケーションがそれほど複雑にならない限り、yaccで生成されたパーサーを導入する代わりに、開始条件を使用するのが良い方法だと思います。

いくつかの考え:

BEGIN(comment)私が見る例では、BEGIN( )で括弧を使用することもあれば、()を使用しないこともありBEGIN commentます。それが違いを生むとは思えませんが、一貫している必要があります。

この本は、一致しない文字をエコーするデフォルトのルールは、排他的な開始条件の下でもまだ有効であると述べているので、必要はありません

. { ECHO; }

開始条件は排他的であるため、とにかく起動しません。念のため、次のように書き直すことができます

<*>.|\n     ECHO;
于 2013-01-10T16:23:03.220 に答える