如何检测和处理Lex程序中未列出的无效令牌?

问题描述 投票:1回答:1

我正在做一个关于用Flex构建词法分析器的功课。

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

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

/* 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)...

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

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

compiler-construction flex-lexer lex
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.