3

私はCプログラムをトークン化するためのlexプログラムを書いています。Cプリプロセッサディレクティブに一致する次のルールを作成しました

 #.*                             {printf("\n%s is a PREPROCESSOR DIRECTIVE",yytext);}

しかし、ファイルをyyinへの入力として使用すると、ファイル内のプリプロセッサディレクティブは、表示されるyytextと一致します。空です。

例:

is a PREPROCESSOR DIRECTIVE

yyinstdinの場合は問題ありませんが、これはファイルが入力された場合にのみ発生します。代替のLEXルールはありますか?

4

1 に答える 1

1

問題を引き起こす可能性が高いため、lex 仕様ではなくファイルでは機能しないという事実に注目してください。printfファイル内のlexは、常に少なくとも#. 以下はファイルで機能します。

%{
#include <stdio.h>
%}
%%
#.* { printf("'%s' preproc\n", yytext); }
%%

int yywrap(void)
{
        return 1;
}

int main(int argc, char ** argv)
{
        if (argc > 1)
        {
                if ((yyin = fopen(argv[1], "r")) == NULL)
                {
                        fprintf(stderr, "Can't open `%s'.\n", argv[1]);
                        exit(1);
                }
        }
        return (yylex());
}
于 2013-03-22T13:27:45.063 に答える