我将完整的 c++ 语法复制到我的解析器生成器中,但在解析 C++ 声明时遇到问题。在解析像char* varname这样的指针类型声明时,我们应该如何解释decl 说明符?
以 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”,即 decl 说明符下的节点,而 * 与函数名相关联,即声明符下的节点。(int* cx) 参数声明也被认为是“int”类型,而指针 * 是 cx 声明符下的一个节点。
我的测试正确吗?如果是,那么如果我们必须支持 Visual C++ 特定的函数修饰符关键字(如 __cdecl、__stdcall 或 __fastcall),那么语法应该是什么样的,例如
char * __fastcall
testfunction(int *cx)
{
return;
}
显然,语法要求将“char*”真正视为一种类型,即抽象声明符下的节点。