我将完整的 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;
}
生成的解析树是这样的:
很明显,返回类型“char *”实际上被解析为返回类型“char”,即声明说明符下的节点,而 * 与函数名称相关联,即声明符下的节点。 (int* cx ) 参数声明也被认为是“int”类型,而指针 * 是 cx 声明符下的一个节点。
我的测试是否正确?如果是,那么如果我们必须支持 Visual C++ 特定的函数修饰符关键字(如 __cdecl、__stdcall 或 __fastcall,例如
char * __fastcall
testfunction(int *cx)
{
return;
}
显然,语法要求将“char*”真正视为一种类型,即抽象声明符下的节点。
最佳答案
考虑著名的 char* x, y;
声明。 y
是一个 char
,而不是一个 char*
。原因是 *
仅适用于 x
。 decl-specifier
确实只是 char
。
关于c++ - 如何解释 C++ 语法中的 decl-specifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16277506/