我一直想知道输入锚 ( ^
) 的开头是如何转换为 flex 中的 FSA 的。我知道行尾锚 ( $
) 与要匹配r/\n
的r
表达式匹配。输入锚的开头如何匹配?我看到的唯一解决方案是使用开始条件。它如何在程序中实现?
问问题
2421 次
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 回答