如何在flex中匹配一串杂散字符(不匹配其他正则表达式)



我正在尝试用flex制作一个简单的lexer,它可以读取整数,如果它发现任何不构成整数的字符,它应该打印不匹配的字符字符串。

这些是我使用的模式,以及在模式匹配时执行的C代码。

{INT}({DEL}|{ENTER}) { return INT;}   
{ENTER}              { printf("#End of linen");}
{DEL}               
<<EOF>>              { printf("#End of file#n"); exit(0);}
.                    { printf("Unrecognized characters: %sn",yytext);
                      fprintf(yyout, "Unrecognized characters: %sn",yytext);}

我的问题是,当我使用.时,lexer一次匹配一个字符。然而,如果我使用.+,那么lexer将所有内容与整数匹配,并将所有内容视为错误。

如果我应该显示更多的代码,请告诉我。我将举一个例子,说明我从lexer得到了什么以及我想要什么作为输出。

示例输入文件:

23 55

12 asd

@213

使用.:时的输出文件示例

token=INT;23〃;

token=INT;55

无法识别的字符:1个

无法识别的字符:2

无法识别的字符:

无法识别的字符:s

无法识别的字符:d

无法识别的字符:@

token=INT;213〃;

使用.+:时的输出文件示例

无法识别的字符:23 55

无法识别的字符:12asd

无法识别的字符:@213

期望输出:

token=INT;23〃;

token=INT;55

无法识别的字符:12asd

无法识别的字符:@213

我终于找到了问题的答案。

问题是.包含空格和制表符。因此,当使用.+时,它会吃掉所有的东西以及制表符和空格,并将每一行都视为错误。可能是因为。+提供更长的匹配时间。

[^\t\t]+({DEL}|{ENTER})

这个正则表达式将读取除空白之外的所有内容,直到读取空白为止。然而,如果[^ tn]+的内容是INT,则这将不是将被匹配的正则表达式。INT将被匹配,因为它具有更大的优先级。

我非常怀疑这样的模式是否存在。然而,您可以在上面的解决方案中收集单个杂散字符,并在输入结束时一次性打印/处理每个匹配的非杂散令牌。这涉及到重新分配一个不断增加的缓冲区,可能与完整输入一样大。

最新更新