是什么让这个例子成为上下文无关语言而不是常规语言?
What makes this example a context-free language rather than regular language?
我无法理解是什么使“任意数量的 a 后跟相同数量的 b 和 c”成为上下文无关语言,而“任意数量的 a 后跟任意数量的 b 后跟任意数量的of c's”是一种常规语言,正如我所看到的那样,教师没有解释就表达了这一点。
(注意后面的例子中b和c的个数可能是唯一的,而前者中b和c的个数是相等的)
任何见解表示赞赏;为一个可能粗鲁的问题(格式)道歉。
如果“a”的个数必须等于“b”和“c”的个数之和,则不能在字符串中随意添加“b”或“c” .您可以做的是保留一个堆栈,在其中压入每个“a”,每次看到“b”或“c”时从堆栈中弹出一个。如果句子的结尾正好是一个空栈,那么这个句子是可以接受的。具有单个堆栈的解析器对应于 context-free 语法。
堆栈是解析器状态的一部分,没有任何东西限制堆栈的大小。所以你需要潜在的无限状态。常规语言可以由具有有界状态的解析器解析(通常表示为状态机中的单个状态或从有限的可能性集中进行的其他选择)。这足以识别 a*b*c*
,因为已经看到了多少个“a”或还有多少个“c”并不重要。
您可能知道,如果“a”的数量、“b”的数量和“c”的数量必须相等,那么单个堆栈就不再足以完成识别,语言不再是context-free。该语言是 context-sensitive.
我无法理解是什么使“任意数量的 a 后跟相同数量的 b 和 c”成为上下文无关语言,而“任意数量的 a 后跟任意数量的 b 后跟任意数量的of c's”是一种常规语言,正如我所看到的那样,教师没有解释就表达了这一点。 (注意后面的例子中b和c的个数可能是唯一的,而前者中b和c的个数是相等的)
任何见解表示赞赏;为一个可能粗鲁的问题(格式)道歉。
如果“a”的个数必须等于“b”和“c”的个数之和,则不能在字符串中随意添加“b”或“c” .您可以做的是保留一个堆栈,在其中压入每个“a”,每次看到“b”或“c”时从堆栈中弹出一个。如果句子的结尾正好是一个空栈,那么这个句子是可以接受的。具有单个堆栈的解析器对应于 context-free 语法。
堆栈是解析器状态的一部分,没有任何东西限制堆栈的大小。所以你需要潜在的无限状态。常规语言可以由具有有界状态的解析器解析(通常表示为状态机中的单个状态或从有限的可能性集中进行的其他选择)。这足以识别 a*b*c*
,因为已经看到了多少个“a”或还有多少个“c”并不重要。
您可能知道,如果“a”的数量、“b”的数量和“c”的数量必须相等,那么单个堆栈就不再足以完成识别,语言不再是context-free。该语言是 context-sensitive.