我正在尝试理解上下文相关的语法。
我明白为什么语言喜欢
不是上下文无关的,但是我想知道一种类似于无类型lambda演算的语言是否上下文相关。
我想看一个简单但非玩具的示例(我考虑了上面的玩具示例),它是上下文相关语法的示例,对于某些生产规则,例如可以判断是否有一些符号字符串当前处于范围内(例如,在生成函数主体时)。
上下文敏感的语法是否足够强大,可以使未定义/未声明/未绑定的变量成为语法错误(而不是语义错误)?
我正在尝试理解上下文相关的语法。
我明白为什么语言喜欢
不是上下文无关的,但是我想知道一种类似于无类型lambda演算的语言是否上下文相关。
我想看一个简单但非玩具的示例(我考虑了上面的玩具示例),它是上下文相关语法的示例,对于某些生产规则,例如可以判断是否有一些符号字符串当前处于范围内(例如,在生成函数主体时)。
上下文敏感的语法是否足够强大,可以使未定义/未声明/未绑定的变量成为语法错误(而不是语义错误)?
Answers:
是的,我相信这是可能的,但是不,我不愿意明确地构造该上下文相关的语法。我将把问题分为两个部分来解释我的答案。
(1)非玩具的例子是什么?它应反映变量的声明。我从真实编程中抽象出来的这种语言的建议就是这样。字母为。 该语言是上下文相关的。
(2)为了表明它实际上是上下文相关的,我将使用另一种形式主义。图灵机的磁带线性使用:线性有界自动机LBA。我可以对其进行编程以进行模式匹配/我将连续考虑每个并尝试字母地与适当的进行匹配。LBA等效于上下文相关的语法,但是更容易编程。
我最喜欢的上下文相关语言(CSL)示例是SAT。所述的Landweber-黑田定理说,CSL = NSPACE。任何SAT实例都具有线性大小的证书,因此SAT是CSL。看到我的问题SAT的上下文相关语法?供参考和讨论。
出于相同的原因,许多其他NP硬语言也使用CSL,例如CLIQUE。
CSL中也有相当自然的语言,甚至更难。
但是,除了在论文定理3中使用Landweber的构造之外,我不知道有什么方法可以将任意CSL表示为上下文敏感文法(CSG)。在这种构造中,CSG描述了识别CSL的线性边界自动机的操作过程的相反过程。CSG的产品描述了机器的特定状态是如何通过一次可能的移动产生的。这样的CSG可以直接将自动机翻译成语法,因此它不一定要与语言功能(例如能够声明变量)相对应,而是会被自动机的细节所困扰。
如果您坚持使用CSG而不是CSL,并且您的实际问题是专门针对希望看到包含受限变量范围的语言的CSG,那么Hendrik Jan的答案似乎是一个不错的开始。
是的,上下文相关文法(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 <TENNSE> --> I am
),因此语法无法生成英语的正确陈述。
实际上,我们不能为完整的英语编写上下文无关的语法!
您可能已经注意到,任何自然语言翻译器或语法检查器均无法正常工作(尝试使用长语句)。因为此问题属于上下文敏感的解析算法。
参考:您可以观看Arun Kumar博士的演讲。 在一些演讲中,他准确地解释了您感兴趣的内容。
(将评论扩展为答案)
无论如何,不确定这是否是您想要的示例。
几乎所有真正的编程语言是上下文敏感的(一般意义上的,即混为一谈既乔姆斯基0型和I型文法下的“上下文敏感”,因为这当然是真正的无限制文法是更上下文敏感的比背景敏感的语法)。
例如,“变量需要在使用前声明”,“标识符应该是唯一的”,所有这些都需要上下文(有时称为语义上下文,但这可能会产生误导,因为它始终涉及语法功能)请参见例如https:// www .cs.purdue.edu / homes / hosking / 502 / notes / 04-semantics.pdf
上面的示例是上下文敏感的(在语法/语法意义上以及语义上都是敏感的),这是因为它们谈论其上下文(在上下文之前还是之后)。
“已经定义的变量”是关于上下文之前的变量的使用。“唯一标识符”是标识符声明之前或之后的上下文,依此类推。
另请参见JavaScript是上下文无关语言吗?如此