3

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

4

3 回答 3

3

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

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

于 2012-08-26T03:12:11.320 回答
0

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

  • 行首,和
  • 除此以外。

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

于 2019-01-10T16:26:01.980 回答
0

行锚的开头与模式匹配:

开始线^。

(插入符号后跟一个点)

示例(文本的编号行):

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


%%
于 2020-06-01T19:27:09.197 回答