1

我将完整的 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*”真正视为一种类型,即抽象声明符下的节点。

4

1 回答 1

0

考虑一下著名的char* x, y;宣言。y是一个char,不是一个char*。原因是仅*适用于x。确实decl-specifier是。char

于 2013-04-30T01:05:24.807 回答