我如何定义一个模式,该模式将等同于所有未被 Flex 扫描仪识别的标记?

How do I define a pattern that will equate to all tokens not recognized by the scanner in Flex?

我正在尝试在 Flex 中定义一个模式,当它读取一个尚未定义的标记时会抛出错误。我试过这个:

DIGIT       [0-9]
INT         -?[0-9][0-9]*
DOUBLE      {INT}"."({DIGIT})*
CHAR        [A-Za-z]
CHAR_       [A-Za-z_]
ID          {CHAR}({CHAR_}|{DIGIT})*
HEX         (0X | 0x)[a-fA-F0-9][a-fA-F0-9]*
STRINGLIT   \"(\.|[^"])*\"
ERRSTRING   \"(\.|[^"])*
UNRECCHAR   [^("+"|"-"|"*"|"/"|"%"|"<"|">"|"="|"!"|";"|","|"."|"["|"]"|"{"|"}"|{CHAR_}|{DIGIT})]

%%

"+"           {return '+';}
"-"           {return '-';}
"*"           {return '*';}
"/"           {return '/';}
"%"           {return '%';}
"<"           {return '<';}
">"           {return '>';}
"="           {return '=';}
"!"           {return '!';}
";"           {return ';';}
","           {return ',';}
"."           {return '.';}
"["           {return '[';}
"]"           {return ']';}
"("           {return '(';}
")"           {return ')';}
"{"           {return '{';}
"}"           {return '}';}

{UNRECCHAR} {
            ReportError::UnrecogChar(&yyloc, yytext);
            }

.           {
            ReportError::UnrecogChar(&yyloc, yytext);
            }

两者都不会编译。我收到一条错误消息

scanner.l: unrecognized rule

为什么会这样?

注意:错误处理由单独的 c 文件完成。

. 为我工作了三十年。你一定是做错了什么。

但我建议:

. return yytext[0];

这将匹配先前规则尚未匹配的任何字符,换行符除外,并且 return 将其交给解析器处理,解析器的错误恢复。

注意你应该在解析器中处理一元减号,而不是扫描器。