c++ - 递归下降解析器,用自身初始化变量,困境

标签 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 可能还不在符号表中)。

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

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

最佳答案

[basic.scope.pdecl]

The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example:

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

Here the second x is initialized with its own (indeterminate) value. —end example]

int a(a); 中,声明符在初始化器的左大括​​号处结束,所以是的,编译器需要允许这样做(GCC 提供了一个有用的 -Wuninitialized 警告如果它是一个自动变量)。

关于c++ - 递归下降解析器,用自身初始化变量,困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884905/

相关文章:

c++ - 有和没有结构的指针声明?

php - MySQL:返回特定定界符和下一个非唯一定界符之间的 SUBSTR

python - 你能用一个正则表达式来解析函数参数吗?

c++ - C++ 中此示例的函数重载歧义的解释

c# - LINQ 到 SQL : How to handle ambiguous column names when joining tables?

c++ - 如何确保 STL 算法仅迭代容器中一定数量的元素?

c++ - 编译时如何更改makefile诊断消息[GNU ARM GCC,Eclipse make.exe]

c++ - 默认参数中的 c++ new 运算符及其副作用

python - 在 python 中将 pdf 转换为文本/html,以便我可以解析它

c#歧义错误