我一直想知道输入锚 ( ^) 的开头是如何转换为 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 回答