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

时间:2013-04-29 11:27:41

标签: 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”,即decl-specifier下的节点,而*与函数名称相关联,即声明符下的节点。 (int * cx)参数声明也被认为是类型“int”,而指针*是cx声明符下的节点。

我的测试是否正确?如果是,那么如果我们必须支持Visual C ++特定的函数修饰符关键字,如__cdecl,__ stdcall或__fastcall,那么语法应该是什么样的。

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

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

1 个答案:

答案 0 :(得分:0)

考虑着名的char* x, y;声明。 ychar,而非char*。原因是*仅适用于xdecl-specifier确实只是char