C预处理指令的Lex规则

3

我正在编写一个词法分析器程序来对一个C程序进行标记。我已经编写了以下规则来匹配C的预处理指令。

 #.*                             {printf("\n%s is a PREPROCESSOR DIRECTIVE",yytext);}
当我将文件作为yyin的输入时,文件中的预处理指令会被匹配,但yytext显示为空。 例如,我得到的结果是:
is a PREPROCESSOR DIRECTIVE

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


通常情况下,您会解析已经预处理过的C程序。那么为什么要对C程序进行标记化?难道您不能使用一些现有的C解析器或扩展一些现有的编译器(例如使用http://gcc-melt.org/来扩展`gcc`)吗? - Basile Starynkevitch
这是我们编译器实验课程的一项练习。 - Sridhar
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1
请关注它不能使用文件而不是词法规范,因为这更有可能导致问题。在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());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,