我如何检测和处理一些未在 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
。所以 .
就是你想要的。
我正在做有关使用 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
。所以 .
就是你想要的。