【问题标题】:Lex rule for C preprocessor directiveC 预处理器指令的 Lex 规则
【发布时间】:2013-03-12 08:40:20
【问题描述】:

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

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

但是当我使用一个文件作为 yyin 的输入时,文件中的预处理器指令被匹配的 yytext 显示为空

例如我得到

is a PREPROCESSOR DIRECTIVE

yyinstdin 时没有问题,但只有在输入文件时才会出现这种情况。有替代的 LEX 规则吗?

【问题讨论】:

  • 您通常会解析已经预处理的 C 程序。为什么要标记 C 程序?你不能使用一些现有的 C 解析器,或者扩展一些现有的编译器(例如,使用 gcc-melt.org,例如,对于 gcc)?
  • 这是我们编译器实验室实践科目中的一个练习

标签: c c-preprocessor lex


【解决方案1】:

关注它不适用于文件而不是 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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多