Regex flex如何匹配线锚的开头?
我一直想知道输入锚(Regex flex如何匹配线锚的开头?,regex,algorithm,flex-lexer,finite-automata,nfa,Regex,Algorithm,Flex Lexer,Finite Automata,Nfa,我一直想知道输入锚(^)的开头是如何在flex中转换为FSA的。我知道行尾锚点($)由表达式r/\n匹配,其中r是要匹配的表达式。输入锚的开头是如何匹配的?我看到的唯一解决方案是使用启动条件。如何在程序中实现它?行尾标记$与\n的不同之处在于,它也匹配EOF,即使在文件末尾未找到行尾标记\n或\r\n 我没有研究flex的实现,但我将使用布尔标志实现^和$。^标志将首先设置,然后在一行中的第一个字符后重置为false,然后在下一个行尾标记后重置为true,依此类推。如果扫描仪使用^anchor,
^
)的开头是如何在flex中转换为FSA的。我知道行尾锚点($
)由表达式r/\n
匹配,其中r
是要匹配的表达式。输入锚的开头是如何匹配的?我看到的唯一解决方案是使用启动条件。如何在程序中实现它?行尾标记$
与\n
的不同之处在于,它也匹配EOF
,即使在文件末尾未找到行尾标记\n
或\r\n
我没有研究flex的实现,但我将使用布尔标志实现
^
和$
。^
标志将首先设置,然后在一行中的第一个字符后重置为false
,然后在下一个行尾标记后重置为true
,依此类推。如果扫描仪使用^anchor,则每个开始条件都需要两个初始状态条目:
- 行的开头,以及
- 否则
Flex执行此操作,并在输入指针后面窥视以确定要查询的条目。线锚的开头与模式匹配: 从弗林开始 (插入符号后跟一个点) 示例(文本的编号行):
因此,您的实施方式类似于启动条件,对吗?@AaditMShah我不确定您所说的“启动条件”是什么意思。我编辑了答案,以修复打字错误和空格缺失。
%{
int ln = 1;
%}
beginningOfLine ^.
newline \n
%%
{beginningOfLine} { if (ln == 1) {
printf ("%d \t", ln);
printf (yytext);
ln++;
}else{
printf (yytext);
}
}
{newline} { printf ("\n");
printf ("%d \t", ln);
ln++; }
%%