我如何检测和处理一些未在 Lex 程序的模式中列出的无效令牌?

How can I detect and handling some invalid token which is not listed in patterns in Lex program?

我正在做有关使用 Flex 构建词法分析器的作业。

我应该将一些只有 +, - 运算符的中缀表达式转换为 post 修复表达式。此外,我应该将整数、实数、标识符(不需要声明)作为操作数处理。

我像这样定义了一些常规定义和模式,

/* regular definition */
delim   [ \t]
ws  {delim}+
letter  [A-Za-z_]
digit   [0-9]
id  {letter}({letter}|{digit})*
number  {digit}+(\.{digit}+)?(E[+-]?{digit}+)?

%%

{ws}        {/* no action and no returns */}
{id}        { return (ID); }
{number}    { return (NUMBER); }
[+-]        { return (OPERATOR); }
[\n]        { return (ENTER); }
<<EOF>>     { return (END_OF_FILE); }
[.*]        { return (INVALID); }

%%

并且我定义了模式 [.*] 来描述所有无效的令牌。 例如,以数字 (0abc) 开头的无效标识符,无效的文字表示 (12.23.2)...

如果表达式中有一些无效的标记(每个表达式都是一行),我只想打印一些错误消息,而忽略那一行。

所以我的问题是,在我的案例中有一些更好的方法来描述或检测无效令牌吗?

[.*] 匹配点或星号。要匹配任意字符,请使用不带括号的 .

请注意,您只想在此处匹配单个字符。您不希望 .* 因为它会匹配整行并且通常会被选中而不是其他规则,因为它会产生更长的匹配。例如,如果您使用 .*foo bar 将被解释为单个 INVALID 标记,而不是由 space 分隔的两个 ID。所以 . 就是你想要的。