我正在尝试用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将被匹配,因为它具有更大的优先级。
我非常怀疑这样的模式是否存在。然而,您可以在上面的解决方案中收集单个杂散字符,并在输入结束时一次性打印/处理每个匹配的非杂散令牌。这涉及到重新分配一个不断增加的缓冲区,可能与完整输入一样大。