我正在尝试在 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 文件完成。
.
已经为我工作了三十年。你一定做错了什么。
但我建议:
. return yytext[0];
这将匹配任何尚未与先前规则匹配的字符(换行符除外),并将其返回到解析器进行处理,解析器的错误恢复。
注意,你应该在解析器中处理一元减号,而不是扫描程序。