C编译器剖析_1.3 由文法到分析器_声明Declaration

本文探讨了C语言中的复杂声明处理,通过一个示例“int (*f(int,int,int))[4];”展示了如何从文法到分析器解析声明。文章解释了声明的文法规则,并指出虽然符合文法,但某些声明可能违反C语言的语义规则,如函数返回函数。此外,文章介绍了如何构建声明的语法树,以理解和解析类型信息,最后建议使用typedef以提高代码可读性。" 114789738,9616592,Python网络攻城狮必学:变量基本语法,"['Python编程', '网络攻城狮', '基础语法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    下面,让我们再看看ucc\examples\sc\decl.c,这里我们要处理的是变量或函数的声明。

为了使函数能带不同个数的参数,此处增加了一个ParameterList,实际运用的文法如下所示:

     Declaration   ----->    int Declarator

     Declarator   ----->   * Declarator  | PostfixDeclarator 

     PostfixDeclarator ---> DirectDeclarator | PostfixDeclarator [num]

                          | PostfixDeclarator (ParameterList)

     ParameterList --->  int |  ParameterList , int

     DirectDeclarator ----->  id  | (Declarator)

    我们以” int (*f(int,int,int))[4];”这个看起来复杂一点的声明为例子,进入命令行,运行以

下命令,我们得到的结果是” f is:  function(int,int,int)which returns pointer to array[4] of int”,分析器告诉我们,f实际上是一个带3个int参数的函数,其返回值是一个指针,指向包含4个整数的数组。

         // Windows 8

         D:\src\ucc\examples\sc>       nmake-f Makefile.win

         // Linux

         iron@ubuntu:sc$  make

    由于我们在这个简单的语言中只引入了int这个基本类型,所以所有的声明都是以int开头的,之后再跟上声明符Declarator。在声明符Declarator中,我们可以进一步指定要声明的标志符为指针类型、数组类型或者函数类型。如果把*、[]和()看成类型运算符,把int这样的基本类型看成操作数,通过声明,我们实际上是在书写类型表达式。通过整数的四则运算表达式,我们希望CPU做计算,从而可以得到运算结果;而通过类型表达式,程序员为各个标志符指明了其类型。非终结符Declarator代表的实际上是以下集合:

    {PostfixDeclarator, * PostfixDeclarator, ** PostfixDeclarator, ***PostfixDeclarator, …}

&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值