如何定义一个模式,该模式将等同于Flex中扫描程序无法识别的所有标记?

时间:2016-02-02 22:25:49

标签: c compiler-construction flex-lexer

我试图在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:无法识别的规则

为什么会这样?

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

1 个答案:

答案 0 :(得分:0)

. return yytext[0]; 已经为我工作了三十年。你一定做错了。

但我建议:

{{1}}

这将匹配除了换行符之前尚未与先前规则匹配的任何字符,并将其返回到解析器以进行处理,解析器的错误恢复。

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