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

How to match a string of stray characters (matching no other regular expression) in flex?

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

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

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

我的问题是,当我使用 . 时,词法分析器一次匹配一个字符。但是,如果我使用 .+,那么词法分析器将匹配所有内容以及整数,并将所有内容视为错误。

如果我要显示更多代码,请告诉我。我将给出一个例子,说明我从词法分析器得到的输出和我想要的输出。

示例输入文件:

23 55

12asd

@213

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

token=INT, value="23"

token=INT, value="55

Unrecognized characters: 1

Unrecognized characters: 2

Unrecognized characters: a

Unrecognized characters: s

Unrecognized characters: d

Unrecognized characters: @

token=INT, value="213"

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

Unrecognized characters: 23 55

Unrecognized characters: 12asd

Unrecognized characters: @213

期望的输出:

token=INT, value="23"

token=INT, value="55

Unrecognized characters: 12asd

Unrecognized characters: @213

我非常怀疑这种模式是否存在。但是,您可以只收集上面解决方案中的单个杂散字符,并 print/process 它们与每个匹配的非杂散标记一起并在输入末尾一次性收集。这涉及重新分配大小不断增加的缓冲区,可能与完整输入一样大。

终于找到问题的答案了

问题是 . 包含 space 和制表符。因此,当使用 .+ 时,它将连同制表符和 space 一起吃掉所有内容,并将每一行都视为错误。可能是因为 .+ 提供了更长的匹配。

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

此正则表达式将读取除 white-spaces 之外的所有内容,直到读取到 white-space。然而,如果 [^ \t\n]+ 的内容是一个 INT,这将不是要匹配的正则表达式。 INT 将被匹配,因为它具有更高的优先级。