上篇给出了数组和指针的归约过程,此篇要进一步开辟新阵地——函数!主要用到文法树中的类型和抽象类型以及语句中的compound-stm;
语句和表达式的归约过程将在后期陆续给出,这里函数定义只是简单的一对花括号。
函数声明和定义归约
示例代码
本代码部分来自与C99标准中的范例
int f(void);
int f(char *str, ...);
int *fip();
int (*pfi)();
int (*apfi[3])(int *x, int *y);
int (*fpfi(int (*)(long), int))(int, ...);//这个复杂,比较难理解,在此文最后总结部分,给出详细解释和使用实例
void addscalar(int n, int m, int a[n][n*m+300], int x);//来自与C99,不重述
int f(int (*p1)(int (*p2)(int (*p3)(void))));//在总结中给出解释
int f()
{
}
归约过程
curr: int next: f
type-specifier
declaration-specifiers
curr: ID next: (
declaration-specifiers direct-declarator
curr: ( next: void
curr: void next: )
declaration-specifiers direct-declarator ( type-specifier
declaration-specifiers direct-declarator ( declaration-specifiers
declaration-specifiers direct-declarator ( parameter-declaration
declaration-specifiers direct-declarator ( parameter-list
declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-specifiers direct-declarator
declaration-specifiers declarator
declaration-specifiers init-declarator
declaration-specifiers init-declarator-list
curr: ; next: int
declaration
declaration-list
curr: int next: f
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ID next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: char
curr: char next: *
declaration-list declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers
curr: * next: str
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers pointer
curr: ID next: ,
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: ...
curr: ... next: )
declaration-list declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: *
declaration-list type-specifier
declaration-list declaration-specifiers
curr: * next: fip
declaration-list declaration-specifiers pointer
curr: ID next: (
declaration-list declaration-specifiers pointer direct-declarator
curr: ( next: )
curr: ) next: ;
declaration-list declaration-specifiers pointer direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: (
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ( next: *
curr: * next: pfi
declaration-list declaration-specifiers ( pointer
curr: ID next: )
declaration-list declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: )
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: (
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ( next: *
curr: * next: apfi
declaration-list declaration-specifiers ( pointer
curr: ID next: [
declaration-list declaration-specifiers ( pointer direct-declarator
curr: [ next: 3
curr: 3 next: ]
declaration-list declaration-specifiers ( pointer direct-declarator [ primary-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ postfix-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ unary-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ cast-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ multiplicative-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ additive-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ shift-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ relational-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ equality-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ AND-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ exclusive-OR-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ inclusive-OR-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ logical-AND-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ logical-OR-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ conditional-expression
declaration-list declaration-specifiers ( pointer direct-declarator [ assignment-expression
curr: ] next: )
declaration-list declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: *
declaration-list declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers
curr: * next: x
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers pointer
curr: ID next: ,
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: int
curr: int next: *
declaration-list declaration-specifiers direct-declarator ( parameter-list , type-specifier
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers
curr: * next: y
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers pointer
curr: ID next: )
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: (
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ( next: *
curr: * next: fpfi
declaration-list declaration-specifiers ( pointer
curr: ID next: (
declaration-list declaration-specifiers ( pointer direct-declarator
curr: ( next: int
curr: int next: (
declaration-list declaration-specifiers ( pointer direct-declarator ( type-specifier
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers
curr: ( next: *
curr: * next: )
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers ( pointer
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers ( abstract-declarator
curr: ) next: (
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator
curr: ( next: long
curr: long next: )
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator ( type-specifier
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator ( declaration-specifiers
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator ( parameter-declaration
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator ( parameter-list
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator ( parameter-type-list
curr: ) next: ,
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers direct-abstract-declarator
declaration-list declaration-specifiers ( pointer direct-declarator ( declaration-specifiers abstract-declarator
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-declaration
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-list
curr: , next: int
curr: int next: )
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-list , type-specifier
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-list , declaration-specifiers
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-list , parameter-declaration
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-list
declaration-list declaration-specifiers ( pointer direct-declarator ( parameter-type-list
curr: ) next: )
declaration-list declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: ,
declaration-list declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers
declaration-list declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: ...
curr: ... next: )
declaration-list declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: void
declaration-list declaration
declaration-list
curr: void next: addscalar
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ID next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: n
declaration-list declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers
curr: ID next: ,
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: int
curr: int next: m
declaration-list declaration-specifiers direct-declarator ( parameter-list , type-specifier
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers
curr: ID next: ,
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: int
curr: int next: a
declaration-list declaration-specifiers direct-declarator ( parameter-list , type-specifier
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers
curr: ID next: [
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator
curr: [ next: n
curr: ID next: ]
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ primary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ postfix-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ unary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ cast-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ shift-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ relational-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ equality-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ AND-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ exclusive-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ inclusive-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ logical-AND-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ logical-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ conditional-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ assignment-expression
curr: ] next: [
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator
curr: [ next: n
curr: ID next: *
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ primary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ postfix-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ unary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ cast-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression
curr: * next: m
curr: ID next: +
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression * primary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression * postfix-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression * unary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression * cast-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ multiplicative-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression
curr: + next: 300
curr: 300 next: ]
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression + primary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression + postfix-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression + unary-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression + cast-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression + multiplicative-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ additive-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ shift-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ relational-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ equality-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ AND-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ exclusive-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ inclusive-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ logical-AND-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ logical-OR-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ conditional-expression
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator [ assignment-expression
curr: ] next: ,
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
curr: , next: int
curr: int next: x
declaration-list declaration-specifiers direct-declarator ( parameter-list , type-specifier
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers
curr: ID next: )
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-list , parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: f
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ID next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: (
declaration-list declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers
curr: ( next: *
curr: * next: p1
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers ( pointer
curr: ID next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: (
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers
curr: ( next: *
curr: * next: p2
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( pointer
curr: ID next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
curr: ( next: int
curr: int next: (
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers
curr: ( next: *
curr: * next: p3
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( pointer
curr: ID next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( pointer direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers ( declarator
curr: ) next: (
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
curr: ( next: void
curr: void next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( type-specifier
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: )
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers direct-declarator
declaration-list declaration-specifiers direct-declarator ( declaration-specifiers declarator
declaration-list declaration-specifiers direct-declarator ( parameter-declaration
declaration-list declaration-specifiers direct-declarator ( parameter-list
declaration-list declaration-specifiers direct-declarator ( parameter-type-list
curr: ) next: ;
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
declaration-list declaration-specifiers init-declarator
declaration-list declaration-specifiers init-declarator-list
curr: ; next: int
declaration-list declaration
declaration-list
curr: int next: f
declaration-list type-specifier
declaration-list declaration-specifiers
curr: ID next: (
declaration-list declaration-specifiers direct-declarator
curr: ( next: )
curr: ) next: {
declaration-list declaration-specifiers direct-declarator
declaration-list declaration-specifiers declarator
curr: { next: }
curr: } next: NULL
declaration-list declaration-specifiers declarator compound-statement
declaration-list function-definition
declaration-list function-definition-list
translation-unit
总结
int (*pfi)();//这是个函数指针
int (*apfi[3])(int *x, int *y); //这是个函数指针数组,三个函数类型是int (*)(int *, int *)指针变量
它的最大应用就是钩子函数!假设三个功能函数接口类型一致,且有相对编号012,那么指针数组就派上用场了,使用编号调用接口等等吧,这只是常见的应用一种方式!
int (*fpfi(int (*)(long), int))(int, ...);
从最里层开始看起,int (*)(long)这是个抽象函数类型,它指定了函数fpfi的第一个参数的类型,即fpfi()函数第一个参数是个函数指针,紧接是个int,即fpfi()第二参数是个整型变量。fpfi()函数的返回值类型是int (*)(int, ...),这样就清楚了!
函数名:fpfi
返回值:int(*)(int, ...)
参数:P1:int(*)(long); p2:int
为了便于理解,写个简单范例,注意这个范例很黄很暴力!哈哈
#include <stdio.h>
int (*mother(int (*)(long), int))(int);
int girl(long leg)
{
printf("girl's leg? %ld\n", leg);
return -1;
}
int boy(int big)
{
printf("boy's pipe ? %d\n", big);
return -2;
}
int (*mother(int (*g)(long), int m)) (int)
{
g(35);
printf("mother marry%d\n", m);
return boy;
}
int main(int argc, char *argv[])
{
int (*father)(int);
printf("first:\n");
father = mother(girl, 10);
father(19);
int (*(*wife)(int (*)(long), int))(int);
printf("second:\n");
wife = mother;
father = wife(girl, 15);
father(21);
return 0;
}
int f(int (*p1)(int (*p2)(int (*p3)(void))));
函数f的参数类型是 int (*)(int (*)(int (*)())),意思就是(*p2)的参数是个函数指针int (*)(),(*p1)的参数还是个函数指针 int (*)(int (*)())