递归下降解析器,变量与自身的初始化,困境



我想知道是否需要符合C++编译器才能支持以下代码:

int a(a);      // no other a is visible, we mean initialization of a with itself

Visual Studio 2013不支持它(未声明的标识符),但是其他一些编译器会编译它。

这是我们的困境:对于可能的表达式检查,我们需要处理有关a(包括其类型)的信息,因为它可以是表达式的一部分,但是还有另一种可能性是它是函数,在这种情况下,我们只是构造类型表达式(符号a可能还没有在符号表中)。

我认为递归下降解析器更有可能在这种困境中运行,因为它本质上是非常结构性的,支持这种特定情况就像一个特殊的"拐杖"(当我们遇到()内部a并且我们处于某种递归级别时,正在构造类型表达式)。所以我假设Visual Studio使用递归下降策略。

因此,考虑到所有这些,是否值得编译器编写者的努力以及支持此类代码是否合理(尤其是在使用递归下降时)?

[basic.scope.pdecl]

名称的声明点在其完成后立即 声明符(第 8 条)及其初始值设定项(如果有)之前,但 下面注明。[ 示例:

unsigned char x = 12;
{ unsigned char x = x; }

在这里,第二个 x 使用它自己的(不确定)值进行初始化。—结束示例]

int a(a);中,声明符在初始值设定项的左大括号处结束,所以是的,编译器需要允许这样做(如果它是自动变量,GCC 会帮助给出-Wuninitialized警告)。

最新更新