我经常听到C++是一种上下文敏感语言的说法.请看以下示例:
a b(c);
Run Code Online (Sandbox Code Playgroud)
这是变量定义还是函数声明?这取决于符号的含义c.如果c是变量,则a b(c);定义名为btype 的变量a.它是直接初始化的c.但是如果c是一个类型,则a b(c);声明一个名为a的函数b,c并返回一个a.
如果您查找无上下文语言的定义,它基本上会告诉您所有语法规则必须具有仅由一个非终端符号组成的左侧.另一方面,上下文敏感语法允许左侧的任意字符串的终端和非终端符号.
浏览"C++编程语言"的附录A,除了左侧的单个非终端符号之外,我找不到单个语法规则.这意味着C++是无上下文的.(当然,在无上下文语言形成上下文敏感语言的子集的意义上,每种无上下文语言也都是上下文敏感的,但这不是重点.)
那么,C++是无上下文还是上下文敏感?
c++ syntax grammar context-free-grammar context-sensitive-grammar
我正在阅读解析器和解析器生成器,并在维基百科的LR解析页面中找到了这个语句:
可以使用LR解析器的一些变体来解析许多编程语言.一个值得注意的例外是C++.
为什么会这样?C++的哪个特定属性导致无法使用LR解析器进行解析?
使用谷歌,我只发现C可以用LR(1)完美解析,但C++需要LR(∞).