我想将 flex 与字符串缓冲区一起使用,而不是默认的标准输入,所以我使用yy_scan_string. 除了“以结尾”模式外,它几乎可以正常工作。
例如
%%
ab$ {//do something}
%%
ab$意味着匹配“ab”,如果它恰好是结束字符串,使用标准输入作为输入,它可以工作,但如果它是yy_scan_string,它不是。
测试:
%option noyywrap
%{
#include <stdio.h>
%}
%%
ab$ { printf("match ab$\n"); }
%%
int main(int argc, char ** argv)
{
if (argc > 1)
yy_scan_string(argv[1]);
yylex();
if (argc > 1)
yylex_destroy();
}
然后使用flex test.l; gcc lex.yy.c;if using echo ab | ./a.out,它打印match ab$,并且工作正常,但如果 using ./a.out ab,它只打印 input ab,不匹配该ab$规则。