【问题标题】:Are the grammars of modern programming languages context-free or context-sensitive?现代编程语言的语法是上下文无关的还是上下文敏感的?
【发布时间】:2012-03-27 23:43:51
【问题描述】:

C++、C# 或 Java 语言是上下文无关的还是上下文敏感的?

【问题讨论】:

标签: parsing programming-languages grammar theory


【解决方案1】:

C++ 既不是上下文无关的,也不是上下文敏感的,因为template system is Turing-complete 和确定一段 C++ 代码是否合法 C++ 非常困难。例如,我可以定义一个模板类,它在字符串上模拟 TM,然后创建一个常量,如果机器接受,则值为 1,如果不接受,则为 0。如果我这样做了,那么如果 TM 在给定的输入上停止,则以下代码将是合法的:

int myArray[TMTemplate</* ... args ... */>::value];

因为如果 TM 拒绝,这会创建一个大小为 0 的数组,这是不允许的。

C# 和 Java 都不是上下文无关的,因为检查变量是否在特定范围内正确且一致地使用已知不是上下文无关的(证明很复杂,依赖于 Ogden's lemma)。但是,我不确定它们是否与上下文相关。

希望这可以部分回答您的问题!

【讨论】:

  • 我不确定模板的图灵完备性是否会影响 C++ 的 语法。当然,模板元编程的结果可以决定程序是否通过某些语义检查,但这远远超出了语法的范围。模板对语法没有任何改变:如果程序有语法错误,模板不会被实例化,如果它们被实例化,它们永远不会导致语法错误。您是否还认为所有静态类型语言都是上下文相关的,因为您需要知道所有涉及的类型才能决定是否使用赋值语句是否有效?
  • 根据这种解释,您的回答是有道理的。这不是我解释这个问题的方式,但那是因为我假设“上下文无关语言”(OP 使用)只是“具有上下文无关语法的语言”的简写。但我认为这是有道理的(如果这确实是问题,那么你的答案是正确的)。您应该在答案中添加该解释,以防止进一步的误解。
  • 变量类型测试和“正确性”评估与语言是否无上下文无关。您在谈论静态分析,这不是解析器的一部分。只有当且仅当解析器的状态可以改变规则匹配的内容时,才可以说语言是上下文敏感的。此外,如果一种语言不是上下文无关的,那么它就是上下文相关的——一种语言不可能两者都不是。
  • @BT- 语言绝对不是上下文无关或上下文相关的。上下文相关语言是上下文无关语言的严格超集,但它们并不涵盖所有语言。不区分上下文的语言比上下文敏感的语言多得多。具体来说:一种语言是上下文敏感的,当且仅当存在一个线性有界自动机,并且 LBA 的数量无限小于语言的数量。
  • @BT- 此外,虽然传统上编译器通过首先进行解析然后进行语义分析来工作,但从形式语言的角度来看,所有有效程序的字符串集合不是上下文无关的。有许多字符串可以合法地解析,但不是合法的程序。我的回答是指一种语言中所有合法计算机程序的集合不是上下文无关的,而不是没有编译器可以使用的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多