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

时间:2016-04-27 08:54:06

标签: c++ parsing ambiguity recursive-descent

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

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

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

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

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

考虑到这一切,是否值得编译器编写者的努力以及是否有理由支持这样的代码(特别是在使用递归下降时)?

1 个答案:

答案 0 :(得分:1)

[basic.scope.pdecl]

  

名称的声明点在完成后立即生效   声明者(第8条)和初始化器之前(如果有的话),除了   如下所述。 [示例:

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

这里第二个x用它自己的(不确定的)值初始化。 -end example ]

int a(a);中,声明符结束于初始化程序的左括号,所以是的,编译器需要允许这个(如果它是一个自动变量,GCC会帮助发出-Wuninitialized警告)。