我正在做这个程序来理解词法分析器的正常功能.但是,当我正在编译此程序时,它显示错误消息::
"bl: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;
}
你的printf动作有一个未闭合的字符串文字.您可能应该删除之前的报价%s.
因为标准C不允许多行字符串,所以flex允许多行字符串在动作中被认为是奇怪的.但是,一些C编译器允许(或确实)允许多行字符串文字.特别是,gcc允许它们达到大约v3.3,因此flex假定 - 在这种情况下,错误地 - 多线字符串文字是故意的.
识别以行开头并继续行结束的任何令牌也可能不正确printf.这将包括printfamily例如.如果这是尝试在不解析它们的情况下将参数包含在printf中,那么在printf调用分布在多行上,或者在同一行上跟随另一个命令的情况下,它将失败.