这么长个程序还是需要用一个例子走一遍才好理解.
就书上后面那个就好.
void (comp)(int *, char , int (fnc)())
主函数和dcl函数没有改变,只改变了dirdcl,并且加入了几个新的函数用以分析其余的那些情况.
前面的类型名会被主函数读取走,所以直接看后面的修饰符部分.
开始调用dcl函数检查(dcl = 1).
gettoken首先读取遇到了'',计数变量自增.然后再次执行判断式,gettoken读取下一个修饰符为'(',保存在tokentype,不执行循环体.
调用dirdcl函数.(dirdcl = 1).
判断式为真,执行语句调用dcl函数.(dcl = 2).
for循环体判断式gettoken读取下一个修饰符为'',判断为真,执行循环体计数变量自增为1(这里的ns = 1,因为每次调用ns都是会被初始化的.)判断式再次进行判断,gettoken读取下一修饰符为comp,并将其保存在token数组中.
然后再次调用dirdcl函数.(dirdcl = 2)
dirdcl函数里判断式tokentype == NAME为真,执行后面的语句.
判断外部数组name[0]是否等于'\0'空字符.
判断为真,才会将token中保存的名称复制到name中.
首先,正常情况下,第一个识别出的名字才是正确的.所以需要name中什么都没有的情况下将token中保存的名字赋值到name中.
其次,对于外部数组或来说.未初始化的元素都是'\0'.这是我用个小程序测试出来的.所以满足条件将token复制到name数组中.
然后向下继续,while循环体.判断式中,gettoken函数继续读取下一修饰符.判断是一个括号还是方括号或者一个左括号.(如果左括号右边如果不是紧跟着一个右括号')',那么只会将这个'('单独作为返回值返回给调用函数)
后面的语句就是将相应的字符串添加到out中.
这里面有个parmdc函数,看一下.
这是一个单独的文件,包含有好几个函数.
首先第一个遇到的就是parmdcl函数.
它先调用一次dclspec函数然后再判断是否之后跟有一个','如果有那么再次判断.
dclspec函数
首先通过gettoken获取下一个标识符.
然后就是通过do-while循环,判断这个标识符是设么类型.第一个判断式用于分析不是类型名的情况,并调用dcl函数去处理.
第二个和第三个判断式分别调用一个函数去处理,分析各种类型名.
第四个是错误情况.
循环终止的条件是遇到了一个','这个表示分割的符号或者遇到了')'这个表示参数表结束的右括号.
每种特定的情况会将相应的标识符前面加个空格放入temp这个缓冲区中.
函数typespec
首先声明并初始化一个指针数组type,这个数组的元素分别指向那几个类型名的首字符,
然后将保存当前标识符的token数组的地址传给指针pt.
然后用bsearch这个查找函数判断当前的这个标识符是否是type中的一个.
不是返回NO,是就返回YES.
这个bsearch的功能百度就好.没必要写出来.
然后函数typequal函数跟上一个函数同理.
compare函数
这个函数是作为bsearch函数的第五个参数用的.
而这个函数的原型中,第五个参数是指针.所以不需要写compare的参数表.
用法就是将比对的内容,用这个函数进行比对.
网友评论