kallytin 发表于 2010-09-26 14:45

函数调用

最近在做一个类C 的小型编译器,在语义分析时遇到一个问题:函数调用与函数声明之间如何有效识别?

我的理解:
例子如下:

1)函数的声明:
int abc(int a, double b);
void xyz(char *a, int b);

2) 函数调用
int a = abc(10,20.1);
xyz("aaa",10);

上面1)和2)肉眼很容易分辨出哪个是声明,哪个是调用。但对于C编译器来说,在扫描“声明”时,会将函数名、参数等放入符号表(看需要可能要设置作用域)。而在符号表,函数名和参数等都只是符号(且通常的做法还会记录他们的类型),那函数声明与函数调用的区别就不容易判别了。因为对于函数调用(如2))来说,函数名同样为符号abc(类型为int);第一个参数都为int类型,第二个参数都为double类型.......

另,函数声明的意义和函数调用的意义是不一样的。函数的声明主要是针对符号表的,而函数的调用则更多的是跟栈桢、作用域等打交道。因此想请教一下,如何才能有效地识别“函数的声明”及“函数的调用?谢谢。

kallytin 发表于 2010-09-26 14:46

回复 1# kallytin


先顶一下

EricFisher 发表于 2010-09-26 17:13

这个,函数声明和调用的语法是不一样的吧。你可以对照着C语法标准看看。

cjaizss 发表于 2010-09-27 09:22

对于非gcc语法(不能内嵌局部函数),应当很好判别吧。
否则,充其量最多相当于if-else悬挂问题,你把后面的括号里面的部分都分析了,再来解决这个函数是申明还是调用。

prolj 发表于 2010-09-27 10:26

已经有一个青年,说他要发明一种新语言,比C++强大,比C++简单,比C++高效。
又有两个青年,组成一个团伙。要发明一种新语言,比C++强大,比C++简单,比C++高效。
又看见lz,我老了:em16:

dibug 发表于 2010-09-27 11:32

已经有一个青年,说他要发明一种新语言,比C++强大,比C++简单,比C++高效。
又有两个青年,组成一个团伙。 ...
prolj 发表于 2010-09-27 10:26 http://linux.chinaunix.net/bbs/images/common/back.gif


    哈哈~他发明的语言一定是C+++ {:3_197:}

dibug 发表于 2010-09-27 11:33

应该是C+ {:3_179:}
页: [1]
查看完整版本: 函数调用