C预处理器指令的Lex规则

C预处理器指令的Lex规则,c,c-preprocessor,lex,C,C Preprocessor,Lex,我正在编写一个lex程序来标记C程序。我编写了以下规则来匹配C预处理器指令 #.* {printf("\n%s is a PREPROCESSOR DIRECTIVE",yytext);} 但是,当我使用一个文件作为yyin的输入时,文件中的预处理器指令与YY匹配,显示的文本为空 e、 g我明白了 is a PREPROCESSOR DIRECTIVE 当yyin为stdin时没有问题,但这仅在输入文件时出现。是否有替代的LEX规则?

我正在编写一个lex程序来标记C程序。我编写了以下规则来匹配C预处理器指令

 #.*                             {printf("\n%s is a PREPROCESSOR DIRECTIVE",yytext);}
但是,当我使用一个文件作为yyin的输入时,文件中的预处理器指令与YY匹配,显示的文本为空

e、 g我明白了

is a PREPROCESSOR DIRECTIVE

yyinstdin时没有问题,但这仅在输入文件时出现。是否有替代的LEX规则?

请关注这样一个事实,即它不能处理文件而不是LEX规范,因为这更可能导致问题。
lex
文件中的
printf
应至少打印
。以下内容适用于文件:

%{
#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());
}
%{
#包括
%}
%%
#.*{printf(“%s”preproc\n,yytext);}
%%
int-yywrap(无效)
{
返回1;
}
int main(int argc,字符**argv)
{
如果(argc>1)
{
if((yyin=fopen(argv[1],“r”)==NULL)
{
fprintf(stderr,“无法打开“%s”。\n”,argv[1]);
出口(1);
}
}
返回(yylex());
}

您通常解析已经预处理过的C程序。为什么要标记化C程序?您不能使用一些现有的C解析器,或者扩展一些现有的编译器(例如,使用for
gcc
)吗?这是我们编译器实验室实践主题中的一个练习