tem*_*def 6

C++既不是上下文也不是上下文敏感的,因为模板系统是Turing-complete并且确定一段C++代码是否合法C++是不可判的.例如,我可以定义一个模拟字符串上模拟TM的模板类,然后创建一个值为1的常量(如果机器接受),如果不接受,则创建0.如果我这样做,那么如果TM在给定输入上停止,则以下代码将是合法的:

int myArray[TMTemplate</* ... args ... */>::value];
Run Code Online (Sandbox Code Playgroud)

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

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

希望这能为你的问题提供部分答案!

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