如何在 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 将被匹配,因为它具有更高的优先级。
我正在尝试用 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 将被匹配,因为它具有更高的优先级。