我只是自动机领域的新手。我读过很多文章,看过很多视频。我坚持了一些最初的话题。这对其他人来说可能很容易。但是花了很多时间,我仍然无法理解它。 主题是:字母表中的歧义
字母表是 = {A, Aa, bab, d} 字符串是 s= AababA
作者说,这是模棱两可的字母表,因为当计算机读取它时,它会从左到右阅读。在大写字母 A 之后,再次出现小 A 的前缀 A,将产生歧义。字母(符号(不应再次成为新字母的前缀。 此外,作者说。 我们将以两种方式标记它(AababA(:
- (呜呜呜( (一(
- (一( (阿巴( (一(
之后,第一个是可以的,第二个是不好的,因为上面字母表中的歧义。
- 以两种方式标记上述字符串的过程是什么? 有什么具体的规则吗?
- 由于第二组,字母表如何模棱两可。
- 如果由于前缀 A 而无效,那么如何?前缀在字母表歧义中的作用是什么?
- 如果我们不考虑前缀,只是简单地将两个字符串组与上面的字母表匹配,那么我们可以很容易地判断,第二个与上面的字母不匹配,那么我们为什么要讨论那个前缀呢?
我希望,这个问题会被认为是重要的,这样这个答案将帮助我摆脱这种困惑。我将非常感激.
作者选择了一个令人困惑的例子。如果你分享你得到这个例子的来源,我可以给出一个更好的答案,但我认为在这种情况下,没有实际的歧义。如果你看到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>
在一个分支中,您有一个错误。在一个分支中,您不会。正如您所指出的,分词器应该选择第一个。不过,两者都有错误。关键是这里有一个明确的选择,即首选最长的有效标记化。字母表中没有任何内容会迫使您做出此选择。选择最短的匹配选项同样有效。这将是非常不切实际的,但这是一个有效的选择。