【发布时间】:2012-08-26 03:00:47
【问题描述】:
我一直想知道输入锚 (^) 的开头是如何在 flex 中转换为 FSA 的。我知道行尾锚 ($) 与表达式 r/\n 匹配,其中 r 是要匹配的表达式。输入锚的开头如何匹配?我看到的唯一解决方案是使用开始条件。如何在程序中实现?
【问题讨论】:
标签: regex algorithm flex-lexer finite-automata nfa
我一直想知道输入锚 (^) 的开头是如何在 flex 中转换为 FSA 的。我知道行尾锚 ($) 与表达式 r/\n 匹配,其中 r 是要匹配的表达式。输入锚的开头如何匹配?我看到的唯一解决方案是使用开始条件。如何在程序中实现?
【问题讨论】:
标签: regex algorithm flex-lexer finite-automata nfa
行尾标记$ 与\n 的不同之处在于它也匹配EOF,即使行尾标记\n 或\r\n 未在行尾找到文件。
我没有查看 flex 的实现,但我会使用布尔标志同时实现 ^ 和 $。最初会设置^ 标志,然后在一行中的第一个字符之后重置为false,然后在下一个行尾标记之后设置回true,依此类推。
【讨论】:
如果您的扫描器使用 ^anchor,那么每个开始条件都需要两个初始状态条目:
Flex 会这样做,并在输入指针后面窥视以确定要查阅的条目。
【讨论】:
行首锚点与模式匹配:
开始线^。
(插入符号后跟一个点)
示例(文本行编号):
%{
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++; }
%%
【讨论】: