【问题标题】:Error in lex programlex 程序中的错误
【发布时间】:2015-10-11 13:32:01
【问题描述】:

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

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

我不明白为什么,因为我在谷歌上搜索了一些原因,它说在动作部分可能有一些额外的右括号,但事实并非如此。

%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;
}

【问题讨论】:

    标签: c flex-lexer lex


    【解决方案1】:

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

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


    识别以printf 开头并持续到行尾的任何 标记也可能是不正确的。例如,这将包括 printfamily 之类的内容。如果这是试图将 arguments 包含到 printf 而不解析它们的尝试,那么在 printf 调用分布在多行的情况下,或者在同一行上跟随另一个命令时,它将失败.

    【讨论】:

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