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