如何跳过Flex中的空格?

时间:2015-09-01 04:06:10

标签: regex whitespace flex-lexer

我正在使用flex为大学作业生成我的词法分析器。它应该识别整数,浮点数,变量名称和数学运算符。它也应该忽略任何空白像字符,如“”,“\ n”,“\ t”等。首先,我只是试图捕捉像这个“或”更多的空白字符串联的空白字符。我的规则文件是:

%{
  #include<stdio.h>
%}
%%
[0-9]+ printf("inteiro:%s\n",yytext);
[0-9]+\.[0-9]+ printf("fracionário:%s\n",yytext);
[a-zA-Z][a-zA-z0-9]* printf("variável:%s\n",yytext);
\+|\-|\*|\/|\*\* printf("operador:%s\n",yytext);
\(|\) printf("parênteses:%s\n",yytext);
[[:space:]]|[[:space:]]+;
%%

使用以下输入

12 + 413

它会生成此输出:

inteiro:12 operador:+ inteiro:413

我想问为什么最后一行不能像:

[[:space:]]+;

1 个答案:

答案 0 :(得分:2)

规则

if // add a second date column {
    $("#date2").removeClass("hide");
    $("#airfare2").removeClass("hide");
    . . .
    $("#totals2").removeClass("hide");
}

有点奇怪。

flex规则包含一个模式和一个(可选)动作,由空格分隔。由于[[:space:]]|[[:space:]]+; 之前没有空格,因此它是模式的一部分,而不是动作。因此,该模式匹配单个空白字符(;)或([[:space:]])一个或多个空格字符的序列,后跟分号(|)。

由于该规则中没有任何操作,因此只会忽略该模式。实际上,这意味着您将忽略所有空格(一次一个字符),如果它们前面有空格,您也将忽略分号。

你可能想要的是

[[:space:]]+;

(不需要采取任何措施,但插入注释以使缺席可见是很有用的。)

顺便说一句,角色类通常比倾斜木材森林(即一堆反斜杠逃脱)更具可读性。另外,flex允许您使用双引号来引用字符串。

所以而不是

[[:space:]]+     /* sem ação */
你可以写:

\+|\-|\*|\/|\*\*    /* operador */
\(|\)               /* parênteses */

在第一个字符类中,重要的是将 - 放在字符列表的开头或结尾处,这样就不会将其解释为定义一系列字符。

而且,在构建扫描程序时,请考虑使用[-+*/]|"**" /* operador */ [()] /* parênteses */ (调试)选项,而不是插入自己的调试printf语句。这将为您打印出完整的调试信息,让您准确了解扫描仪正在做什么。