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