正如标题所示,DFA和NFA与正则表达式有何关联?学习DFA和NFA是否有助于更好地理解正则表达式?
答案 0 :(得分:2)
有限自动机(fa),正则表达式(re)以及常规语法都是常规语言的有限表示。所有这些目的的目的是表达一个常规的集合/语言(对于其他类别的语言,如cfg,csl等也是如此)。
自动机相对于理论目的更有用,分析语言属性 - 复杂性类。
在有限自动机的情况下,deterministic (DFA)和non-deterministic (NFA)模型都代表同一类语言,称为“常规语言”(对于npda≭pda的其他语言则不然)。
正则表达式(re):是以字母形式表示常规语言的另一种方式,这对于在编程语言中表示一组有效字符串非常有用(这里自动机不能直接使用,而正则表达式并不多有助于分析语言属性,例如完全描述泵浦引理)。
DFA和NFA如何与正则表达式相关?
不能直接从英语语言描述中构造自动机或正则表达式算法。虽然,如果我们有任何一个表示(FA或RE),那么我们可以系统地编写其他表示,例如。we can write regular expression for a DFA/NFA in step by step and systematic manner, using Arden's theorem.(查看此链接)
让我们举一个语言示例:L =“偶数a
和b
'”。
L的正则表达式是:
(
(a + b(aa)*ab)(bb)*(ba(aa)*ab(bb)*)*a +
(b + a(bb)*ba)(aa)*(ab(bb)*ba(aa)*)*b
)*
直接为这种语言编写正则表达式非常困难(甚至很快就能理解这一点)。
但是从DFA和使用Arden'theorm,为语言L编写正则表达式很简单。
重要的是,为这种语言绘制DFA相对简单(也易于记忆)。
另一个例子可以是"symbols 0
and 1
, where decimal equivalent of binary string is divisible by 5"以上的语言,与写DFA相比,写RE会非常困难。
我们也可以算法地绘制DFA from a regular language。
学习DFA和NFA是否有助于更好地理解正则表达式?
是的,原因如下:
直接从英文描述中编写的正则表达式可能有问题。当我们为某些语言编写编译器时,错误的dfa的机会就会少于错误的正则表达式,那么优先/正确的步骤被认为是从每个令牌首先绘制DFA,然后编写他们的等静态正则表达式 - DFA将考虑正确性证明 - dfa更具描述性,易于掌握语言构造(DFA是正确的,然后RE将是正确的。)
如果重复是复杂的,你要找到“语言描述是什么?”,那么你可以从re中绘制DFA然后给出语言描述。
有时找到更好的效果,你可以绘制DFA然后翻译它以最小化DFA然后使用最小化DFA写回来可能会给你更好的解决方案。 (它不是一般技术,可能会有所帮助)
如果难以比较两个正则表达式,那么您可以比较它们相应的DFA以检查等效性。
注意:有时编写正则表达式比绘制DFA要简单得多。
答案 1 :(得分:0)
非确定性有限自动机(NFA)是一种可以识别常规语言的机器。
正则表达式是一个描述常规语言的字符串。
可以通过算法构建NFA,以识别给定正则表达式描述的语言。在输入字符串上运行NFA将告诉您正则表达式是否与输入字符串匹配。
因此,可以使用NFA来实现正则表达式引擎,但是不需要了解它们就可以充分发挥正则表达式的作用。