gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:07:43 25 4
gpt4 key购买 nike

我将完整的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com