java - JFlex 错误 : Unexpected character: YYINITIAL

标签 java lexer jflex

我尝试将 JFlex 与以下输入文件一起使用:

%class Lexer

%line
%column

%init{
yybegin(YYINITIAL);
%init}

%{
        Copied directly to Java file.
%}

delim       =   \r|\n|\r\n
not_newline =   .
whitespace  =   {delim} | [ \t\n\r]
any     =   {not_newline} | {delim} | {quote}
upp_letter  =   [A-Z]
low_letter  =   [a-z]
digit       =   [0-9]
quote       =   [\”]
backslash   =   [\\]
escape      =   {backslash}{any}
LPAR        =   [(]
RPAR        =   [)]
COMMA       =   [,]
letter      =   {upp_letter} | {low_letter}
ID      =   {letter}({letter}|{digit})*
INT     =   {digit}+
STRING      =   {quote}({letter} | {digit} | {escape})*{quote}


%%

<YYINITIAL> {

    {ID}        { return ID }
    {INT}       { return INT }
    {LPAR}      { return symbol(sym.LPAR); }
    {RPAR}      { return symbol(sym.RPAR); }
    {COMMA}     { return symbol(sum.COMMA); }
    {STRING}    { return STRING }

    {whitespace}    {}

}

[^]         { throw new Error(“Illegal character <“+yytext()+”>”); }

(还没有100%完成,我只是想看看是否有任何错误)

无论如何,当我尝试使用 JFlex 时,它给了我以下错误:

Reading "lexer2.flex"

Error in file "lexer2.flex" (line 35): 
Unexpected character 
<YYINITIAL> {
^
1 error, 0 warnings.

我认为扫描仪是从哪里开始的,并且默认情况下总是声明它?我错过了什么吗?

感谢您的帮助。

最佳答案

您的 .flex 文件格式错误。正如 JFlex manual 所定义的,您必须像这样组织文件:

UserCode 
%% 
Options and declarations 
%% 
Lexical rules

您当前没有用户代码,因此您可以以 %% 开始您的文件,表明该文件立即以选项和声明开始。所以文件的开头看起来像这样:

%%
%class Lexer

%line
%column

关于java - JFlex 错误 : Unexpected character: YYINITIAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837308/

相关文章:

java - 如何匹配 CUP 解析器语法中的空大小写

java - Spring MVC @RequestMapping 注释的不区分大小写的映射

java - 应为 BEGIN_ARRAY,但在第 1 行第 53 列路径 $.data 处为 BEGIN_OBJECT

java - 词法分析只给出一个输出?

java - JFlex 扫描仪 ArrayIndexOutOfBoundsException : 769

intellij-idea - 自定义语言的 BNF 规则语法突出显示

java - 如何使用maven创建示例Openwhisk-Java应用程序并为其创建Docker镜像

java - Arraylist 长度,我认为我的老师对此不正确

haskell - 当使用像 Parsec 这样的解析器组合器库时,我应该使用词法分析器吗?

parsing - 简单/入门 ANTLR4 程序 : Exception (AntlrInputStream cannot be cast to CharStream)