下面,让我们再看看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, …}
&