什么是自动机理论中字母表中的歧义?



我只是自动机领域的新手。我读过很多文章,看过很多视频。我坚持了一些最初的话题。这对其他人来说可能很容易。但是花了很多时间,我仍然无法理解它。 主题是:字母表中的歧义

字母表是 = {A, Aa, bab, d} 字符串是 s= AababA

作者说,这是模棱两可的字母表,因为当计算机读取它时,它会从左到右阅读。在大写字母 A 之后,再次出现小 A 的前缀 A,将产生歧义。字母(符号(不应再次成为新字母的前缀。 此外,作者说。 我们将以两种方式标记它(AababA(:

  • (呜呜呜( (一(
  • (一( (阿巴( (一(

之后,第一个是可以的,第二个是不好的,因为上面字母表中的歧义。

  1. 以两种方式标记上述字符串的过程是什么? 有什么具体的规则吗?
  2. 由于第二组,字母表如何模棱两可。
  3. 如果由于前缀 A 而无效,那么如何?前缀在字母表歧义中的作用是什么?
  4. 如果我们不考虑前缀,只是简单地将两个字符串组与上面的字母表匹配,那么我们可以很容易地判断,第二个与上面的字母不匹配,那么我们为什么要讨论那个前缀呢?

我希望,这个问题会被认为是重要的,这样这个答案将帮助我摆脱这种困惑。我将非常感激.

作者选择了一个令人困惑的例子。如果你分享你得到这个例子的来源,我可以给出一个更好的答案,但我认为在这种情况下,没有实际的歧义。如果你看到Aa,你可以知道第一个词素一定是"Aa",因为字母表中没有任何东西以"a"开头。

对于一个更简单的例子,请考虑字母 {A, a, Aa} 和字符串"AAaAaaA">

您可以通过以下方式对此进行标记:

(A) (A) (a) (A) (a) (a) (A)
(A) (Aa) (A) (a) (a) (A)
(A) (A) (a) (Aa) (a) (A)
(A) (Aa) (Aa) (A)

这通常通过选择在每种情况下匹配的最长词法来解决,这将产生最后一个标记化。


现在让我们回到你的例子,但让我们让字符串稍微不同一点:"AababAe"。

可以通过以下方式标记字符串:

(Aa) (bab) (A) <error>
(A) <error>

在一个分支中,您有一个错误。在一个分支中,您不会。正如您所指出的,分词器应该选择第一个。不过,两者都有错误。关键是这里有一个明确的选择,即首选最长的有效标记化。字母表中没有任何内容会迫使您做出此选择。选择最短的匹配选项同样有效。这将是非常不切实际的,但这是一个有效的选择。

最新更新