“无上下文语法”中的“上下文”指的是什么?


30

在线上有很多关于上下文无关语法的定义,但是我发现没有什么可以满足我的主要麻烦:

它没有什么背景

为了进行调查,我用Google搜索了“上下文敏感语法”,但是仍然找不到“上下文”的含义。

有人可以解释一下context这些名称中的术语吗?


5
我发现Wikipedia的解释非常好-“无论非终结符的上下文如何,只要可以应用其生成规则,那么正式语法就被认为是“无上下文的”。无论围绕哪个符号,左侧的单个非终结符始终可以由右侧代替。” -可以改写并简化为“普通英语”,但对我而言,要点很明确。
jkff 2015年

1
@jkff,很高兴您能找到很好的解释,但我仍然无法理解“上下文”在这里的真正含义。我需要看一个有上下文但没有上下文的示例。在我看来,我所见过的每一个语法都具有上下文关系
CodyBugstein 2015年

定义不清楚吗?
拉斐尔

2
具有讽刺意味的是,该定义中缺少上下文的关键部分,因此我仅添加了一个句子来解释它。
reinierpost,2015年

2
示例:在C ++ 11中,override根据使用的位置(即上下文),可以是变量名也可以是关键字。如果在方法声明后使用,则为关键字。否则不是。这是上下文相关语法的一个示例。
Thomas Eding

Answers:


37

您是对的,总有某种意义上的上下文。我认为您不了解产品就无法理解“上下文”在“无上下文”中的含义。

生产是替代规则。它说,要在语言中生成字符串,可以用左边的替换右边的:

A -> xy

这意味着抽象序列A可以由字符“ x”替换,后跟字符“ y”。您还可以制作更复杂的作品:

zA -> xy

这意味着可以在字符“ z”之后加上抽象序列A替换为字符“ x”和“ y”。

与上下文无关的生产仅表示左侧只有一件事。第一个示例是上下文无关的,因为无论A之前还是之后,都可以用“ x”和“ y”代替A。但是,在第二个示例中,字符“ z”必须出现在A之前,然后可以用“ x”和“ y”替换该组合,因此涉及一些上下文。

因此,无上下文语法只是具有无上下文产物的语法。

第二个示例实际上是不受限制的生产的示例。在上下文无关和不受限制之间还有另一种类别,称为“上下文敏感”。上下文相关生产的一个示例是:

zA -> zxy

所不同的是,必须保留左侧A之前(和之后)的内容。这实际上意味着只有A被取代,但只能在适当的上下文中被取代。


2
谢谢,这是一个巨大的帮助!我从未真正看到过一个语法示例,但如您所示,左侧有多个变量。我想这就是为什么我看不到“上下文”是什么的原因。谢谢
CodyBugstein 2015年

4
也许一个更简单的上下文示例是zA -> zxy:A仍被xy代替,但仅在z之后。
MSalters 2015年

更详细地讲,此答案讨论的是无限制的语法,而@MSalters指出上下文相关的语法可以更好地说明上下文的含义。

@MSalters:你有一个好点。我修改了答案。我很难想出一种在我的描述中添加这些细节的方法,但听起来似乎并不复杂,所以我最终要做的只是在最后添加更多细节。
沃恩·卡托

9

考虑规则 ,假设您有一个句子形式那么将A简化为β并不取决于α和δ是什么。这样一来,它就不受上下文限制,因为它不依赖于周围的上下文。

Aβ
αAδ

什么是Beta?是终端还是变量?可以解释“句子形式”吗?这是否意味着无法进一步推导?
CodyBugstein 2015年

Beta可以是A-> beta是规则的任何东西。句子形式意味着使用语法规则给定您的起始符号,我们会将其转换为结果。此结果称为句子形式。每次使用完每条规则后,我们都会得到一个新的句子形式。
iLoveCamelCase 2015年

3
@Imray您需要查看语法和上下文无关语法的正式定义。理解形式对象没有捷径。
拉斐尔

1
@Imray 句子形式是一连串的终端符号和非终端符号,它们是通过应用语法规则(也称为产生式)从公理(也称为初始符号)派生而来的。通过将规则应用于其非终结符之一,可以将其转换为另一种形式。当没有非终结符时,句子形式就是句子,即语法定义生成的语言中的字符串或单词。术语来自语言学家,他们曾经是形式语言理论这一部分的主要贡献者。
2015年

我想到了一个句型不能有任何变量-它需要只是终端。
CodyBugstein 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.