C语法归约之函数(2)

上篇给出了数组和指针的归约过程,此篇要进一步开辟新阵地——函数!主要用到文法树中的类型和抽象类型以及语句中的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 (*)())

下篇:表达式

时间: 2024-08-05 12:42:47

C语法归约之函数(2)的相关文章

C语法归约之表达式(3)

1.概要 前三篇博文(0,1,2)主要讨论是声明和定义的相关语法归约.从这篇文字开始,将开始进行有效的计算,涉及表达式和语句. 首先,表达式和语句这两个概念是不同的,表达式是没有分号(;)的,而表达式+:构成语句.但这不是语句的全部,语句还可以是跳转,迭代,标签语句等等(见图片C语句文法图)!打个比喻来说吧--就是蛋和鸡的关系!当然不是那个悖论,而是表达式是蛋,孵化是分号,鸡是语句.蛋孵化成鸡.鸡肚子里可以有蛋!嘎嘎!二者区别必须明白.不能混为一谈! 在C语言中,如果单纯就表达式计算而言,表达式

C语法归约之数组和指针(1)

上一篇,开始了语法归约,给出变量声明定义初始化归约过程,和c99文法图,请查阅这里,相关文法图在这里依然要使用 1.数组归约 1.1.示例代码 int a[10]; int a[2][3]; int a[2][3][4]; struct AA boy[100]; struct AA boy[100][100]; union BB girl[10]; 1.2.归约过程 curr: int next: a type-specifier declaration-specifiers curr: ID

C语法归约之语句(5)

这是语法归约最后一部分了,后面文法当中还有个外部归约.它已经在前面以及这里都提及到了,也就是把全局声明定义和函数定义整合的过程,最后归约成一颗完整的树.根结点就是translation-unit,因此不再单独示例! 示例代码 void foo() { start: for(i = 1; i < NR; ++i) { if(i % 13 == 0) goto start; } } void foo() { a = b + c; return; } void foo() { if(a < 0) a

Java 语法 索引 ----- 主函数 (Main)

public class MyApp { public static void main(String[] args) { System.out.print("Hello World"); } } Java 语法 索引 ----- 主函数 (Main),布布扣,bubuko.com

C语法归约之变量声明和定义(0)

0前言 闲来无事,在屋里多看了一眼<编译原理>(2V),有练练手的冲动--采用LR(1)技术,写了一个C语言的语法归约器!之所以用LR(1)是因为gcc,ucc,tcc和lcc跟商量好似的,清一色的用的LL归约技术,书上也是讲的跟天花一样漂亮,那么就说明它已经十分成熟了,如果再使用LL技术实在是炸不出价值来,源码一抓一大把,看看就够了,重写必要性不大!另外,书中的LR技术讲的项集又是大的没谱,工作量太大:如果使用工具yacc生成,又不知道它咋搞的猫腻,所以就没有踩它们的脚印,自己整套方法hig

javascript基础一语法和常用函数

1语法 1.1引入的方式 在html中引入javascript,使用script标签,在html页面中包括外部引入js方式和在html内部引入js方式.如下两种: 方式一: <script type="text/javascript">要写的javascript内容</script> 方式二: <script type="text/javascript" src="引入外部的js文件"></script&

MDX语法之排序函数Order

使用场景: 排列指定集的成员,可以选择保留或打乱原有的层次结构. 语法: Numeric expression syntax Order(Set_Expression, Numeric_Expression [ , { ASC | DESC | BASC | BDESC } ] ) String expression syntax Order(Set_Expression, String_Expression [ , { ASC | DESC | BASC | BDESC } ] )   参数:

python语法学习之函数、类、模块

Python中通过使用类(class)和对象(object)来实现面向对象(object-oriented programming,简称OOP)的编程. 面向对象编程的最主要目的是提高程序的重复使用性,这和函数的目的相类似. 一:函数 如果你需要在程序中重用代码,---------定义函数. def 函数名(参数)://todo 如: 输出: 也可以将函数的参数定义为默认参数,注:默认参数一般放参数的最后,如: 输出: 二:类 类的定义应该是放在面向对象的标题里,但是我们一般函数定义在类里面,从

Web开发技术&mdash;&mdash;JavaScript语法3(函数、运算符、比较和逻辑运算符)

JavaScript 函数 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 实例 <!DOCTYPE html> <html> <head> <script>function myFunction() { alert("Hello World!"); }</script> </head> <body> <button onclick="myFunction()"&