c++ - 如何解释 C++ 语法中的 decl-specifier

标签 c++ parsing visual-c++ grammar parser-generator

我将完整的 C++ 语法复制到我的解析器生成器中,但在解析 C++ 声明时遇到问题。在解析像 char* varname 这样的指针类型声明时,我们应该如何解释 decl-specifier

以MSDN的c++语法为例http://msdn.microsoft.com/en-us/library/0aah9xbf%28v=vs.71%29.aspx :

说明符是这样的:

decl-specifiers :
    decl-specifiersopt decl-specifier
decl-specifier :
    storage-class-specifier
    type-specifier
    fct-specifier
    friend
    typedef
    __declspec ( extended-decl-modifier-seq ) 

根据 msdn 的描述 char *lpszAppName; 应该有一个 decl-specifier = "char * ", name = "lpszAppName".但是我的测试运行显示 decl-specifier 应该是 char,声明符(即名称)应该是 "* lpszAppName" 。请注意,星号在名称之前 - 不在类型关键字 char 之后。这个测试结果似乎是合理的,因为在 decl-specifier 下,我找不到任何定义指针的东西,即 decl-speciifer 下没有可以导致 ptr-operator 的规则.

我用 ANTLR4 解析器生成器测试了从规范中复制的完整 c++ 语法来解析这个:

char * 
testfunction(int *cx)
{
  return;
}

生成的解析树是这样的:

parse tree

很明显,返回类型“char *”实际上被解析为返回类型“char”,即声明说明符下的节点,而 * 与函数名称相关联,即声明符下的节点。 (int* cx ) 参数声明也被认为是“int”类型,而指针 * 是 cx 声明符下的一个节点。

我的测试是否正确?如果是,那么如果我们必须支持 Visual C++ 特定的函数修饰符关键字(如 __cdecl、__stdcall 或 __fastcall,例如

char * __fastcall
testfunction(int *cx)
{
  return;
}

显然,语法要求将“char*”真正视为一种类型,即抽象声明符下的节点。

最佳答案

考虑著名的 char* x, y; 声明。 y 是一个 char,而不是一个 char*。原因是 * 仅适用于 xdecl-specifier 确实只是 char

关于c++ - 如何解释 C++ 语法中的 decl-specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16277506/

相关文章:

c++ - 删除二叉搜索树中的节点时出错

C++ 模板 typedef 作为模板函数参数

c++ - sfml 2 和 cmake 构建

python - 元素树 iter() 正在跳过随机元素

c++ - 无法更改 VC++ CMFCOutlookBar 的 Tab 标签文本

c++ - 是否有 C++ 习惯用法通过模板魔法将所谓的速率组(实时计算)编码到函数中?

python - 将文本文件转换为变量列表

python - 如何在 URL 中的最后一个斜杠之后获取所有内容?

c# - Microsoft Visual C++ 2010 SP1 可在 Azure 上重新分发吗?

visual-c++ - 我们可以在非管理员有权访问的自定义位置安装 VC++ 2015 Redistributable Package 吗?