是什么使该示例成为与上下文无关的语言,而不是常规语言?

问题描述

我很难看到是什么使“任意数量的a后面跟相同数量的b和c”成为上下文无关的语言,而“任意数量的a后面跟任意数量的b后面跟任意数量的c”正如我所看到的那样,“”是一种普通语言,没有老师的解释。 (请注意,在后一个示例中,b和c的数目可以是唯一的,而在前一个示例中,b和c的数目是相等的。)

任何见识表示赞赏;对可能是粗略的问题(格式)表示歉意。

解决方法

如果“ a”的个数必须等于“ b”和“ c”的个数之和,则不能随意在字符串中添加“ b”或“ c”。您可以做的是在每个“ a”上压入一个堆栈,每次看到“ b”或“ c”时都将一个堆栈弹出。如果句子的结尾与一个空堆栈重合,则该句子是可以接受的。具有单个堆栈的解析器对应于上下文无关的语法。

堆栈是解析器状态的一部分,没有什么限制堆栈的大小。因此,您需要潜在的无限状态。常规语言可以由有界状态的解析器解析(通常表示为状态机中的单个状态,或者是从有限的一组可能性中进行其他某种选择)。足以识别@CircuitBreaker,因为已出现多少个“ a”或仍要出现多少个“ c”都无关紧要。

您可能知道,如果“ a”的数量,“ b”的数量和“ c”的数量必须相等,则单个堆栈不再足以进行识别,并且该语言不再是上下文无关的。该语言是上下文相关的。