当关键字在不同的上下文中意味着不同的东西时,这是一个上下文敏感的例子吗?

cor*_*zza 6 scala formal-languages context-sensitive-grammar

根据此答案 => Scala中是具有两种不同的含义关键字:1来表示一个功能类型:Double => Double2以创建lambda表达式:(x: Double): Double => 2*x.

这与正式语法有什么关系,即这会使Scala上下文敏感吗?

我知道大多数语言都没有上下文,但我不确定我所描述的情况是否与此有关.


编辑:

好像我不太了解上下文敏感的语法.我知道生产规则应该是什么样子,以及它们的含义("只有当A被这些符号包围时才适用这种生产"),但我不确定它们与实际(编程)语言的关系.

我认为我的困惑源于阅读"乔姆斯基引入这个术语,因为一个词的含义可能取决于它的语境",并且我=>在引用中与术语"单词"相关联,并且它的两个用法是两个独立的上下文.

如果一个答案可以解决我的困惑,那就太好了.

mik*_*łak 6

我已经处理了形式语言理论已经有一段时间,但我会咬人.

"无上下文"意味着相应语法中所需生产规则没有"上下文".它不是指一个特定的符号不能出现在不同的规则.


解决编辑:换句话说(并且更加非正式地),决定语言是无上下文还是上下文敏感,归结为不要查看特定"单词"或"单词"的"含义".相反,它相当于查看该语言中所有合法表达式的集合,并且只能通过考虑组件"单词" 彼此之间的位置关系来查看是否可以"编码"它们.这基本上就是抽水引理检查的内容.


例如:

S ? Type"="Body
Type ? "Double"
Type ? "Double""=>""Double"
Body ? Lambda
Body ? NormalBody
NormalBody ? "x"
Lambda -> "x""=>"NormalBody
Run Code Online (Sandbox Code Playgroud)

S当然,起始符号在哪里,大写的ID是非终结符号,引用的字符串是终端.显然,这可以生成如下字符串:

Double=>Double=x=>x
Run Code Online (Sandbox Code Playgroud)

但语法仍然没有上下文.

因此,只要这个,因为在非终结"=>"可以出现在两个节目的"地方"的观察,不会使斯卡拉上下文敏感.

但是,它并不意味着:

  • 整个 Scala语言是上下文无关,
  • 它是上下文敏感的 - 它可能更复杂,
  • 如果您想将Scala 的语义编码为语法,您最终会得到无上下文或上下文敏感的语法.

最后一件事特别相关,因为你在形式语言的(nomen omen)语境中提到了"含义".