首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释C++语法中的字母说明符

如何解释C++语法中的字母说明符
EN

Stack Overflow用户
提问于 2013-04-29 11:27:41
回答 1查看 718关注 0票数 1

我将完整的c++语法复制到解析器生成器中,但在解析C++声明时遇到了问题。在解析指针类型声明(如decl-specifier char* varname )时,我们应该如何解释

以MSDN的c++语法为例http://msdn.microsoft.com/en-us/library/0aah9xbf%28v=vs.71%29.aspx

说明者是这样的:

代码语言:javascript
复制
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-说明符= "char * ",name =但是我的测试运行表明,decl-说明符应该是char,声明符(即名称)应该是“* lpszAppName"。注意,星号在名称之前--而不是在类型关键字char后面。这个测试结果似乎是合理的,因为在decl-说明符下,我找不到定义指针的任何东西,即在decl-speciifer下没有任何规则可以导致ptr-operator.。

我使用ANTLR4解析器生成器进行了测试,从规范中复制了完整的c++语法来解析如下:

代码语言:javascript
复制
char * 
testfunction(int *cx)
{
  return;
}

得到的解析树如下所示:

显然,返回类型"char *“实际上被解析为返回类型"char”,即decl-说明符下的节点,而*与函数名(即声明器下的节点)相关联。(int* cx )参数声明也被认为是"int“类型,而指针*是cx声明器下的节点。

我的测试正确吗?如果是,那么如果我们必须支持VisualC++特定的函数修饰符关键字,比如__cdecl、__stdcall或__fastcall,那么语法应该是什么样子的呢?

代码语言:javascript
复制
char * __fastcall
testfunction(int *cx)
{
  return;
}

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

EN

回答 1

Stack Overflow用户

发布于 2013-04-30 01:05:24

考虑一下著名的char* x, y;声明。ychar,而不是char*。原因是*只适用于xdecl-specifier确实就是char

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16277506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档