【问题标题】:How does flex match the beginning of line anchor?flex 如何匹配行锚的开头?
【发布时间】:2012-08-26 03:00:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    行尾标记$\n 的不同之处在于它也匹配EOF,即使行尾标记\n\r\n 未在行尾找到文件。

    我没有查看 flex 的实现,但我会使用布尔标志同时实现 ^$。最初会设置^ 标志,然后在一行中的第一个字符之后重置为false,然后在下一个行尾标记之后设置回true,依此类推。

    【讨论】:

    • 这样你的实现方式会类似于启动条件吧?
    • @AaditMShah 我不确定您所说的“开始条件”是什么意思。我编辑了答案以修复拼写错误和缺少的空格。
    【解决方案2】:

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

    • 行首,并且
    • 否则。

    Flex 会这样做,并在输入指针后面窥视以确定要查阅的条目。

    【讨论】:

      【解决方案3】:

      行首锚点与模式匹配:

      开始线^。

      (插入符号后跟一个点)

      示例(文本行编号):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-04
        • 2015-07-27
        • 2019-08-27
        • 2016-05-02
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多