【问题标题】:Jflex Unexpected Character errorJflex 意外字符错误
【发布时间】:2014-12-18 18:44:36
【问题描述】:

我开始学习 jflex。当我尝试使用 jflex 为以下代码生成输出时,我不断收到错误

Error in file "\abc.flex" (line 29): 
Unexpected character

[ \t\n]+                ;
^
1 error, 0 warnings.

Generation aborted.

代码尝试运行

letter   [a-zA-Z]
digit    [0-9]
intlit      [0-9]+
%{
#include <stdio.h>   
# define BASTYPTOK 257   /*following are output from yacc*/
# define IDTOK 258       /*yacc assigns token numbers */
# define LITTOK 259
# define CINTOK 260
# define INSTREAMTOK 261
# define COUTTOK 262
# define OUTSTREAMTOK 263
# define WHILETOK 264
# define IFTOK 265
# define ADDOPTOK 266
# define MULOPTOK 267
# define RELOPTOK 268
# define NOTTOK 269
# define STRLITTOK 270

main()  /*this replaces the main in the lex library*\
{  int  p;
    while (p= yylex())
              printf("%d is \"%s\"\n", p, yytext);
              /*yytext is where lex stores the lexeme*/}
%}

%%
[ \t\n]+                ;
"//".*"\n"              ;
{intlit}                {return(LITTOK);}
cin                     {return(CINTOK);}
"<<"                    {return(INSTREAMTOK);}
\<|"=="                 {return(RELOPTOK);}
\+|\-|"||"              {return(ADDOPTOK);}
"="                     {return(yytext[0]);}
"("                     {return(yytext[0]);}
")"                     {return(yytext[0]);}
.                       {return (yytext[0]); /*default action*/}

%%

谁能帮我弄清楚是什么导致了这个问题。 该模式也未正确缩进。 感谢您的帮助。

【问题讨论】:

    标签: flex-lexer lex jflex


    【解决方案1】:

    flex 输入有效,但 jflex 无效。由于包含的代码位于C 而不是Java,我不清楚为什么要使用jflex,但如果您的意图是将扫描仪移植到Java,您可能想阅读@ 987654321@

    尤其是JFlex 输入中的部分与flex 完全不同:

            flex                                 JFlex
    
    definitions and declarations            user code
    %%                                      %%
    rules                                   declarations
    %%                                      %%
    user code                               definitions and rules
    

    因此,您的定义和规则位于 flex 文件的正确部分,但不适用于 JFlex 文件。 (JFlex 只是将第一部分复制到输出,因此它无法识别由于将 flex 声明放在 JFlex 期望有效用户代码的位置而导致的各种语法错误。)

    此外,JFlex 定义的格式为name = pattern 而不是name pattern,因此一旦您整理好文件的顺序,您还需要添加等号。和。当然,重写Java中的C代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2013-09-14
      • 2014-01-13
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多