有人可以给一个简单但非玩具的上下文相关语法示例吗?


12

我正在尝试理解上下文相关的语法。

我明白为什么语言喜欢

  1. {wwwA}
  2. {anbncnnN}

不是上下文无关的,但是我想知道一种类似于无类型lambda演算的语言是否上下文相关。

我想看一个简单但非玩具的示例(我考虑了上面的玩具示例),它是上下文相关语法的示例,对于某些生产规则,例如可以判断是否有一些符号字符串当前处于范围内(例如,在生成函数主体时)。

上下文敏感的语法是否足够强大,可以使未定义/未声明/未绑定的变量成为语法错误(而不是语义错误)?


1
几乎所有真正的编程语言都是上下文相关的(一般意义上,即在“上下文相关”下将chomsky的0型和I型语法混合在一起)。例如,变量在使用前需要声明,标识符应该是唯一的,所有这些都需要上下文(st称为语义上下文,但可能会引起误解)cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M 。

好吧,“上下文相关”是类型1语法的标准术语。
reinierpost

Answers:


8

是的,我相信这是可能的,但是不,我不愿意明确地构造该上下文相关的语法。我将把问题分为两个部分来解释我的答案。

(1)非玩具的例子是什么?它应反映变量的声明。我从真实编程中抽象出来的这种语言的建议就是这样。字母为。 该语言是上下文相关的。{a,b,;,(,)}

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2)为了表明它实际上上下文相关的,我将使用另一种形式主义。图灵机的磁带线性使用:线性有界自动机LBA。我可以对其进行编程以进行模式匹配/我将连续考虑每个并尝试字母地与适当的进行匹配。LBA等效于上下文相关的语法,但是更容易编程。xjwj


谢谢你的帖子。到目前为止,我对LBA不太熟悉,因此对点(2)不太相信。从第(1)点开始,我试图了解如何构造规则,该规则将产生一个变量名,该变量名应作为表达式,而该变量名仅是当前作用域中的一个变量。我不需要看到一个完整的正式CSG,而只需一个非正式的解释即可。我无法想象如何使用多符号变量名,这与上下文的使用方式不同,例如,使用单个非终结符上下文来指导〜英语句子推导中的主语-动词数量一致。

另一方面,我来自正式的语言背景(也不是说英语的母语),而且我很难理解您确切想建模/代表的内容。抱歉! 在我看来,在这种情况下,只是一个玩具示例,而是您想要实现的一部分,具有相同字符串的完整副本(变量名称?){www}
Hendrik Jan

谢谢回复!。是一个玩具示例,我理解为什么它不是上下文无关的,但是我仍然没有直观地“看到”它是如何上下文相关的,或者CSG是如何生成的。让我尝试澄清我不明白的问题(至少有一个后续问题,但这已经足够了):CSG如何在特定环境中使用包含多符号词的上下文再次生成这些词中的一个生产?据我所知,CSG通常通过在生产过程中交换字符并使用单个符号来指导生产而不是多个符号词来工作。
{ww|w...}

3
哦。这是一个相当具体的问题。如果不给出的语法,我可以说几句话。语法说有两个“边界符号” 。在推导过程中,字符串看起来像。从字母表中生成一个字母和一个副本,副本将把生成的字母“移动”(技术上是单调语法,等效于CS)。当“信使”到达它将其字母副本写入。因此,可以复制更长的(多符号)字符串。L R L w R w L a M a w M a b b M a R M a R R a{ww}LRLwRwLaMawMabbMaRMaRRa
Hendrik 2013年1

13

我最喜欢的上下文相关语言(CSL)示例是SAT。所述的Landweber-黑田定理说,CSL = NSPACE。任何SAT实例都具有线性大小的证书,因此SAT是CSL。看到我的问题SAT的上下文相关语法?供参考和讨论。[n]

出于相同的原因,许多其他NP硬语言也使用CSL,例如CLIQUE。

CSL中也有相当自然的语言,甚至更难。

但是,除了在论文定理3中使用Landweber的构造之外,我不知道有什么方法可以将任意CSL表示为上下文敏感文法(CSG)。在这种构造中,CSG描述了识别CSL的线性边界自动机的操作过程的相反过程。CSG的产品描述了机器的特定状态是如何通过一次可能的移动产生的。这样的CSG可以直接将自动机翻译成语法,因此它不一定要与语言功能(例如能够声明变量)相对应,而是会被自动机的细节所困扰。

如果您坚持使用CSG而不是CSL,并且您的实际问题是专门针对希望看到包含受限变量范围的语言的CSG,那么Hendrik Jan的答案似乎是一个不错的开始。


9

是的,上下文相关文法(CSG)足够强大,可以进行未定义/未声明/未绑定的变量检查,但是不幸的是,我们不知道任何有效的算法来解析CSG字符串。

上下文相关语言的一个真实示例是C编程语言。先声明变量然后再使用它们的功能使C语言成为上下文相关的语言(CSL)。(我不知道无类型的lambda演算)。

而且因为我们不知道用于CSL(或CSG)的任何线性解析算法。这就是在编译器设计中的原因,因为我们知道有效的算法来解析CFG(如果格式受限),所以我们使用CFG(及其解析算法)进行语法检查。编译器首先解析上下文无关的功能,然后以有问题的方式处理上下文相关的功能(例如,检查符号表中是否使用了任何已定义的变量,否则将产生错误)。

自然语言处理(NLP)中也使用了上下文相关的语法。而且大多数自然语言都是上下文相关语言的示例。(我不确定是否使用梵语)。

我将尝试通过一个愚蠢但简单的示例来解释它(这只是一个想法,您可以对其进行完善):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

现在,使用此语法,我们可以生成一些正确的语句,但其中一些也是错误的。例如,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

             Grijesh    am       working       [wrong statement]

原因:<TENSE>的值取决于值<NOUN>(例如I &lt;TENNSE> --> I am),因此语法无法生成英语的正确陈述。

实际上,我们不能为完整的英语编写上下文无关的语法!

您可能已经注意到,任何自然语言翻译器或语法检查器均无法正常工作(尝试使用长语句)。因为此问题属于上下文敏感的解析算法。


参考:您可以观看Arun Kumar博士的演讲在一些演讲中,他准确地解释了您感兴趣的内容。


谢谢您提供的信息,这无疑会对其他对同一主题感兴趣的人有所帮助,但这仅与我要问的部分相关。我并不是在解析CSG生成的字符串,而是要看一个简单的(甚至很愚蠢的)正式CSG示例,该示例会生成格式正确的抽象(函数体内没有未绑定的变量)。我可以想象一个CSG会生成正确的“英语”字符串,因为单个符号可以指示主语/动词的一致,但是在抽象的情况下,变量通常由多个符号组成。

1
@BlueBomber:谢谢我一定会回答你的,它在印度的夜晚..N新年快乐!:)
Grijesh Chauhan

看来我只能这样做有限的次数,并且根据[this] [ meta.scicomp.stackexchange.com/questions/156/…,我应该删除此问题,然后将其重新发布到更合适的位置...

@BlueBomber我已标记为要转移,您也可以这样做。
Grijesh Chauhan

1

(将评论扩展为答案)

无论如何,不​​确定这是否是您想要的示例。

几乎所有真正的编程语言是上下文敏感的(一般意义上的,即混为一谈既乔姆斯基0型和I型文法下的“上下文敏感”,因为这当然是真正的无限制文法更上下文敏感的背景敏感的语法)。

例如,“变量需要在使用前声明”,“标识符应该是唯一的”,所有这些都需要上下文(有时称为语义上下文,但这可能会产生误导,因为它始终涉及语法功能)请参见例如https:// www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf

上面的示例是上下文敏感的(在语法/语法意义上以及语义上都是敏感的),这是因为它们谈论其上下文(在上下文之前还是之后)。

“已经定义的变量”是关于上下文之前的变量的使用。“唯一标识符”是标识符声明之前或之后上下文,依此类推。

另请参见JavaScript是上下文无关语言吗?如此


“上下文相关”是指类型1。
reinierpost
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.