我正在尝试使用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
最佳答案
我终于找到了问题的答案。
问题在于.
包含空格和制表符。因此,当使用.+
时,它将吃掉所有内容以及制表符和空格,并将每一行都视为错误。可能是因为。+提供了更长的匹配时间。
[^ \t\n]+({DEL}|{ENTER})
此正则表达式将读取除空格以外的所有内容,直到读取空格为止。但是,如果
[^ \t\n]+
的内容为INT,则它将不是要匹配的正则表达式。 INT将被匹配,因为它具有更高的优先级。
关于regex - 如何在flex中匹配一串流浪字符(不匹配其他正则表达式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34210776/