flex如何匹配行锚的开头?

时间:2012-08-26 03:00:47

标签: regex algorithm flex-lexer finite-automata nfa

我一直想知道输入锚点(^)的开头是如何在flex中转换为FSA的。我知道行结束锚($)与表达式r/\n匹配,其中r是要匹配的表达式。输入锚点的开头是如何匹配的?我看到的唯一解决方案是使用启动条件。如何在程序中实现?

3 个答案:

答案 0 :(得分:3)

行结束标记$\n不同,因为它与EOF匹配,即使行尾标记\n或{{1在文件的末尾找不到。

我没有看flex的实现,但我会使用布尔标志实现\r\n^。最初会设置$标记,然后在行中的第一个字符后重置为^,然后在下一行结束标记后重新设置为false,依此类推

答案 1 :(得分:0)

如果您的扫描仪使用^ anchor,则每个开始条件都需要两个初始状态条目:

  • 行开始和
  • 否则。

Flex会执行此操作,并在输入指针后面偷看以确定要查询的条目。

答案 2 :(得分:0)

行锚的开头与以下模式匹配:

beginningOfLine ^。

(插入点后跟一个点)

示例(文本的编号行):

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


%%