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++; }


%%