我正在使用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:]]+;
答案 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语句。这将为您打印出完整的调试信息,让您准确了解扫描仪正在做什么。