我经常听到有人说c++是一种上下文敏感的语言。举个例子:
a b(c);
这是变量定义还是函数声明?这取决于符号c
的含义。如果c
是c
1,那么a b(c);
定义了一个名为b
的类型为a
的变量。它直接用c
初始化。但如果c
是c
2,则a b(c);
声明一个名为b
的函数,该函数接受c
并返回a
。
如果您查找上下文无关语言的定义,它基本上会告诉您,所有语法规则的左侧必须恰好包含一个非终结符。另一方面,上下文敏感语法允许在左侧使用任意的终结符和非终结符字符串。
浏览“c++程序设计语言”的附录A,我找不到一条语法规则,它的左边除了一个非终结符之外,还有其他任何东西。这意味着c++是上下文无关的。(当然,每一种与上下文无关的语言也是与上下文相关的,因为与上下文无关的语言构成了与上下文相关的语言的一个子集,但这不是重点。)
那么,c++是上下文无关的还是上下文敏感的?