2013-03-22 136 views
2

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

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

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

如我得到

is a PREPROCESSOR DIRECTIVE 

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

+0

您通常会解析已经预处理的C程序。你为什么要标记一个C程序?你不能使用一些现有的C语言分析器,或者扩展一些现有的编译器(例如,用http://gcc-melt.org/,例如'gcc')? – 2013-03-22 13:13:13

+0

这是我们编译器实验练习主题的练习 – Sridhar 2013-03-22 13:26:22

回答

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()); 
}