Parsing 现代编程语言的语法是上下文无关的还是上下文敏感的? 是C++上下文无关的C++语言还是上下文无关的语言?

Parsing 现代编程语言的语法是上下文无关的还是上下文敏感的? 是C++上下文无关的C++语言还是上下文无关的语言?,parsing,programming-languages,grammar,theory,Parsing,Programming Languages,Grammar,Theory,C++既不上下文无关,也不上下文敏感,因为C++代码是合法C++的java是不可判定的硬的。例如,我可以定义一个模板类,该类模拟字符串上的TM,然后创建一个常量,如果机器接受,则值为1,如果不接受,则值为0。如果我这样做了,那么当TM在给定输入上停止时,以下代码将是合法的: int myArray[TMTemplate</* ... args ... */>::value]; intmyarray[TMTemplate::value]; 因为如果TM拒绝,这将创建一个大小为0的数

C++既不上下文无关,也不上下文敏感,因为C++代码是合法C++的java是不可判定的硬的。例如,我可以定义一个模板类,该类模拟字符串上的TM,然后创建一个常量,如果机器接受,则值为1,如果不接受,则值为0。如果我这样做了,那么当TM在给定输入上停止时,以下代码将是合法的:

int myArray[TMTemplate</* ... args ... */>::value];
intmyarray[TMTemplate::value];
因为如果TM拒绝,这将创建一个大小为0的数组,这是不允许的

C#和Java都不是上下文无关的,因为检查变量在特定范围内是否正确一致地使用是已知的,而不是上下文无关的(证明是复杂的,依赖于上下文)。然而,我不确定它们是否是上下文敏感的


希望这能部分回答你的问题

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