我将完整的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”,即decl-specifier下的节点,而*与函数名称相关联,即声明符下的节点。 (int * cx)参数声明也被认为是类型“int”,而指针*是cx声明符下的节点。
我的测试是否正确?如果是,那么如果我们必须支持Visual C ++特定的函数修饰符关键字,如__cdecl,__ stdcall或__fastcall,那么语法应该是什么样的。
char * __fastcall
testfunction(int *cx)
{
return;
}
显然,语法要求将“char *”真正视为一种类型,即抽象声明符下的节点。
答案 0 :(得分:0)
考虑着名的char* x, y;
声明。 y
是char
,而非char*
。原因是*
仅适用于x
。 decl-specifier
确实只是char
。