C语言实现动态选择函数入口
2010-04-28 16:08
351 查看
div{ font-size:12px;}
#notxtindent{width:80px; float:left; border:1px #cccccc solid}
#txtindent{width:80px; float:left; margin-left:10px; border:1px #cccccc solid}
#txtindent p{ text-indent:2em;} 这几天在写一个解释器,用的语言是C语言,环境是VXWORKS 6.7。由于源语言是我自己定义的,有时便会为了方便写解释器而回去修改源语言的语法。最后经过整理,设定源语言每行的第一个单词,标识这条语句的类型。
因此在写解释器的时候,就可以根据每行扫描到的首个单词来决定到底是用哪一个子函数来解析。这就需要在解释器中用C语言实现动态选择函数入口。
首先理顺一下思路,源程序读入到内存后(可以全部读入也可以用两对半缓冲,详见编译技术),解释器要进行逐行扫描,扫描到首个单词时,根据这个单词来决定函数入口。这就需要有一个分配函数,它的返回值是所需函数入口的匹配值,参数是首个单词的字符串。为了方便,我们把所有的函数入口定义为枚举类型:
然后定义分配函数:
这样我们就知道了扫描到某个首单词时该调用哪个函数,下面构造一个函数指针数组,看着比较高级:
调用时可以这样用:
这样就实现了动态选择函数入口的目的。
#notxtindent{width:80px; float:left; border:1px #cccccc solid}
#txtindent{width:80px; float:left; margin-left:10px; border:1px #cccccc solid}
#txtindent p{ text-indent:2em;} 这几天在写一个解释器,用的语言是C语言,环境是VXWORKS 6.7。由于源语言是我自己定义的,有时便会为了方便写解释器而回去修改源语言的语法。最后经过整理,设定源语言每行的第一个单词,标识这条语句的类型。
因此在写解释器的时候,就可以根据每行扫描到的首个单词来决定到底是用哪一个子函数来解析。这就需要在解释器中用C语言实现动态选择函数入口。
首先理顺一下思路,源程序读入到内存后(可以全部读入也可以用两对半缓冲,详见编译技术),解释器要进行逐行扫描,扫描到首个单词时,根据这个单词来决定函数入口。这就需要有一个分配函数,它的返回值是所需函数入口的匹配值,参数是首个单词的字符串。为了方便,我们把所有的函数入口定义为枚举类型:
typedef enum { key_IF = 0, key_FOR, key_GOTO, key_ERROR }keywords;
然后定义分配函数:
keywords yacc(const STRING line) { if(!strncmp(line, "IF", 2)){ return key_IF; } if(!strncmp(line, "FOR", 3)){ return key_DerivedTask; } return key_ERROR; }
这样我们就知道了扫描到某个首单词时该调用哪个函数,下面构造一个函数指针数组,看着比较高级:
void (*key_func[])(const STRING) = { exec_IF, exec_FOR, exec_error };
调用时可以这样用:
(*key_func[yacc(FirstName)])(FirstName);
这样就实现了动态选择函数入口的目的。
相关文章推荐
- java 解决调用c语言实现简单HelloWorld函数生成.dll动态链接库的32位dll文件无法在64位机上运行
- C语言实现异常处理(使用 setjmp 和 longjmp 函数)
- C语言:向函数传递和返回字符串:Strlen函数、Strcpy、Strcat函数函数的实现
- C语言及程序设计提高例程-26 实现线性表基本操作的函数
- 一种C语言打桩函数的源码实现
- 动态修改 C 语言函数的实现
- 在Authorware中实现动态函数图像绘制的程序实现过程
- 使用"函数递归"实现基于php和MySQL的动态树型菜单
- C语言 atoi函数简单实现
- C语言实现常见的矩阵运算函数
- C语言 atoi 函数的实现
- C语言实现冒泡、插入、选择、快速排序
- 用c语言实现求一个字符串长度的函数
- 【c语言】函数实现数组初始化,冒泡排序,现实,和清空功能
- 常见排序算法(冒泡,选择,快速)的C语言实现
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例)
- 百度面试题——用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
- C语言实现md5函数代码
- C语言实现选择排序
- C语言atoi()和itoa()函数的实现