无上下文语法与上下文敏感语法?

时间:2011-11-23 01:55:22

标签: algorithm parsing grammar context-free-grammar context-sensitive-grammar

有人可以向我解释为什么这种语法[无上下文语法和上下文敏感语法]接受字符串吗?

我所知道的是

无上下文语法是一种形式语法,其中每个生成(重写)规则都是V→w的一种形式 其中V是单个非终结符号,w是一串终端和/或非终端。 w可以是空的

上下文相关语法是一种形式语法,其中任何生产(重写)规则的左侧和右侧可能被终端和非终结符号的上下文包围。

但我怎么解释为什么这些语法接受一个字符串?

3 个答案:

答案 0 :(得分:105)

这里一个重要的细节是语法不接受字符串;他们生成字符串。语法是对语言的描述,它提供了生成语言中包含的所有可能字符串的方法。为了判断语言中是否包含特定字符串,您将使用识别器,某种自动机处理给定字符串并说“是”或“否”。

context-free grammar(CFG)是一种语法,其中(如您所述)每个产品的形式为A→W,其中A是非终结符,w是终结符号和非终结符号。非正式地说,CFG是一种语法,任何非终结者都可以在任何时候扩展到任何一个作品。语法的语言是可以从起始符号派生的终端字符串集。

context-sensitive grammar(CSG)是一种语法,其中每个产品的形式为wAx→wyx,其中w和x是终端和非终端的字符串,y也是一串终端。换句话说,制作规则说“如果你在给定的上下文中看到 ,你可以用字符串y替换A.”令人遗憾的是,这些语法被称为“上下文敏感的语法”,因为它意味着“无上下文”和“上下文敏感”并不是对立的,这意味着某些类别的语法可以说需要大量的语境信息被考虑在内但未被正式认为是对上下文敏感的。

要确定字符串是否包含在CFG或CSG中,有许多方法。首先,您可以为给定的语法构建识别器。对于CFG, pushdown automaton (PDA)是一种自动机,可以精确接受无上下文语言,并且有一种简单的结构可以将任何CFG转换为PDA。对于上下文相关语法,您使用的自动机称为 linear bounded automaton (LBA)。

然而,如果天真地对待这些方法,则效率不高。要确定字符串是否包含在CFG的语言中,有更高效的算法。例如,许多语法可以为它们构建LL(k)LR(k)解析器,这允许您(在线性时间内)判断语法中是否包含字符串。可以使用Earley parser解析所有语法,在O(n 3 )中可以确定语法中是否包含长度为n的字符串(有趣的是,它可以解析任何明确的CFG) O(n 2 ),并且前瞻可以在O(n)时间内解析任何LR(k)语法!)。如果你纯粹对“语法G生成的语言中是否包含字符串x?”这一问题感兴趣,那么其中一种方法就会非常出色。如果您想知道如何生成字符串x(通过查找 parse tree ),您可以调整这些方法以提供此信息。但是,解析CSG通常是PSPACE-complete,因此在最坏情况下的多项式时间内没有已知的解析算法。但是,有些算法在实践中往往会快速运行。 解析技术:实用指南(见下文)的作者将a fantastic page containing all sorts of parsing algorithms放在一起,包括解析上下文敏感语言的作者。

如果您有兴趣了解有关解析的更多信息,请考虑查看Grune和Jacobs的优秀书籍“Parsing Techniques: A Practical Guide, Second Edition”,该书讨论了用于确定字符串是否包含在语法中的各种解析算法。如果是这样,它是如何通过解析算法生成的。

希望这有帮助!

答案 1 :(得分:1)

如前所述,语法不接受字符串,但它只是生成您分析的语言的特定单词的一种方式。事实上,作为形式语言理论中的生成规则的语法而不是有限状态自动机就是你所说的,即对特定字符串的识别。 特别是,您需要递归可枚举自动机才能识别Type 1 Languages(Chomsky层次结构中的上下文敏感语言)。 特定语言的语法仅授予您指定收集到CS语言字符串集的所有字符串的属性。 我希望我的解释清楚。

答案 2 :(得分:0)

显示语法接受字符串的一种简单方法是显示该字符串的生成规则。