美文网首页
练习5-20

练习5-20

作者: Hy_Slin | 来源:发表于2018-02-11 14:06 被阅读0次

    这么长个程序还是需要用一个例子走一遍才好理解.
    就书上后面那个就好.
    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的参数表.
    用法就是将比对的内容,用这个函数进行比对.

    相关文章

      网友评论

          本文标题:练习5-20

          本文链接:https://www.haomeiwen.com/subject/lehxlxtx.html