lex程序出错

时间:2015-10-11 13:32:01

标签: c flex-lexer lex

我正在用这个程序来理解词法分析器的正常功能。但是当我编译这个程序时,它显示错误信息::

“b.l:25:在行动中遇到EOF”。

我不明白为什么,因为我在Google上搜索了原因并且它说可能会有一些额外的关闭括号,但事实并非如此。

%option noyywrap
%{
%}
%%
#include<.*> {fprintf(yyout,"\nPREPROCESSOR: %s",yytext);}
main {fprintf(yyout, "\nMAIN:%s",yytext);}
"void"|"int"|"for"|"if"|"return" {fprintf(yyout, "\n KEYWORD:%s",yytext);}
"{"|"}"|"("|")"|";"|"," {fprintf(yyout,"\n SPECIAL SYMBOLS:%s",yytext);}
"<"|">"|"=="|"<="|">=" {fprintf(yyout,"\nCONDITIONAL OPERATORS:%s",yytext);}
"==" {fprinf(yyout,"\nASSIGNMENT OPERATORS:%s",yytext);}
"++"|"--" {fprintf(yyout,"\nINC-DECR OPERATORS:%s",yytext);}
"printf".*|"scanf".* {fprintf(yyout,"\nINBUILT FUNCTIONS:"%s",yytext);}
[0-9]* {fprintf(yyout,"\nNUMBERS:%s",yytext);}
[a-zA-Z] [a-zA-Z0-9_]* {fprintf(yyout,"\nIDENTIFIERS:%s",yytext);}
%%
int main(int argc,char*argv[])
{
    yyin = fopen(argv[1],"r");
    yyout = fopen(argv[2],"w");
    yylex();
    fclose(yyin);
    fclose(yyout);
    return 0;
}

1 个答案:

答案 0 :(得分:5)

您的printf操作有一个未关闭的字符串文字。您可能应该在%s之前删除引用。

因为标准C不允许多行字符串,所以flex允许多行字符串在动作中被认为是奇怪的。但是,一些C编译器允许(或确实)允许多行字符串文字。特别是,gcc允许它们达到大约v3.3,因此flex假定 - 在这种情况下,错误地 - 多行字符串文字是故意的。

识别以printf开头并继续到行尾的任何令牌也可能不正确。例如,这将包括printfamily之类的内容。如果这是尝试将参数包含到printf而不解析它们,那么如果printf调用分布在多行上,或者在同一行上跟着另一个命令,则会失败