我正在做一个关于用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)...
如果表达式中有一些无效的标记(每个表达式都是一行),我只想打印一些错误消息,并忽略该行。
所以我的问题是,在我的案例中有一些更好的方法来描述或检测无效令牌?
[.*]
匹配点或星号。要匹配任意字符,请使用不带括号的.
。
请注意,您只想在此处匹配单个字符。你不希望.*
匹配整行,并且通常会选择其他规则,因为它会产生更长的匹配。例如,如果您使用foo bar
,INVALID
将被解释为单个ID
标记而不是由空格分隔的两个.*
s。所以只要.
就是你想要的。