水编译的两天

来源:互联网 发布:毕业找不到工作知乎 编辑:程序博客网 时间:2024/04/29 23:22

    挺郁闷的。。。代码写的很不爽,虽然挺多感触

     

    首先是整个词法分析器需要返回的东西一直没确定下来,又一直想,定不下来其实也正常好像。。因为语法分析还没看不知道语法分析需要哪些信息可能太晚了迷糊了就没脑子的从1点半想到2点半

    然后今天开始写程序了,一开始直接想写函数模拟DFA了,后来发现需要的保留字那些都没存,往哪里存呢

    然后还有讲的用两个缓冲区交替存储输入来解决缓冲区输入满了的情况,我都不知道缓冲区是什么==于是就想用容器把然后想了想用vector没必要那就string吧后来又发现也没必要最后用了char[]

    然后后来想既然要存挺多东西的,那就用类把,正好类的程序写的太少练练类

    然后一开始写代码,问题就一大堆来了

    1.类名取什么好?

    2.怎么从文件里读入指定长度的包括空白字符的字符串?(翻了PRIMER也没找到最后还是用的get感觉这办法有点笨拙= =)

    3.这个类cffx(到底最后类名取了词法分析首字母。。),要不要绑定文件?不绑定的话进行词法分析的函数需要一个参数,绑定的话好像好点?有没有还没想到的? 白天看了几页程序员修炼之道也是弄得脑子里总觉得好多东西得考虑然后就有点乱。    嗯那就绑定文件吧,那是用ifstream&还是传个文件名进来。  这儿没多纠结,想了想后期也和这文件没什么事了主要就词法分析需要读取文件内容,那就传文件名把文件变量保存到类里外部就不要管了。

    4.嗯别忘了写析构,小心翼翼的看了下成员嗯把文件关掉就好了。

    5.看书好像记得看到需要两个指针一个表示将判断的输入字符一个指向判断过序列的开头这个也是从string::iterator后来改到了char*在前者的时候构造函数里给它初始化了一个0报错还说什么const string::iterator 好吧没懂回去查现在想起来当时为什么不直接给个begin(),应该还是思路不清晰吧 而且最后那个指向序列头的指针也没用上。

    5.关于主要功能的函数getNext(),结构一改再改,从switch 里用一堆ifelse到看到书上一句话“在实际中,可以用一个以字符为下标的地址数组来存放对应于各个case的指令地址,并根据此数组中找到的目标地址一次完成转换” 自然我就想到了map,就想也没想觉得这个switch里的每个case访问起来肯定就是O(1)了,三观被冲击直接把前边已经写好的代码删了重写switch嵌套switch,好吧,那怎么判断字符是字母, 打电话问老师,扯了半天没听到想要的还饭也误了= =, 然后来4101就直接不管了从case a写到了case Z写完呵呵就删了= =。。  最后还是用了ifelse,回去以后具体看看switch怎么实现的。

    6.每个状态的跳转,每次状态转换前还是转换后读下一个字符,EOF在哪个位置判断,缓冲区切换会不会影响了后续字符判断,空白字符是一次性清空还是清一个就continue来让结构清晰,  越写越觉得自己逻辑混乱= = ,删删改改的总算是写完了。 这么一个真心觉得简单的程序, 写起来结果就这么多问题。

    7.反正总结一下,大概就是逻辑不清,然后又总在纠结结构化和效率之间的取舍问题没有经验没有人指导一个人琢磨也没什么收获。

     

     

    有个收获就是知道EOF是个什么东西了==  上次熊问我负数循环自加等于EOF跳出时输出结果是-1我还从二进制表示数的范围结合异常处理balabala一大堆猜。。

     

    然后就是编译原理这个东西。。。正则式到自动机到简单几行代码写出来,觉得程序代码其实只是一个逻辑过程的表述,精髓都在于背后的算法哎。     当然面向对象和面向方面什么的各种程序设计模式和方法,往大说都觉得是哲学,,现在这个渣渣编程能力还体会不到多少,被虐中慢慢成长吧。

     

     

    最后附上一段修炼之道的代码

    1. class Line{
    2. public:
    3. Point start;
    4. Point end;
    5. double length;
    6. };   //“这里有重复,改变startendlength都要随着改变,最好把length改为计算字段”
    7.  
    8. class Line{
    9. public:
    10. Point start;
    11. Point end;
    12. double length() {return start.distanceTo(end);}
    13. };   //“在以后的开发过程中,你可以因为性能原因而选择违反DRY原则。”
    14.  
    15. class Line{
    16. private:
    17. bool changed;
    18. double length;
    19. Point start;
    20. Point end;
    21. public:
    22. void setStart(Point p) {start = p; changed =true;}
    23. void setEnd(Point p) {end = p; changed =true;}
    24.  
    25. Point getStart(void) {return start;}
    26. Point getEnd(void) {return end;}
    27.  
    28. double getLength(){
    29. if (changed){
    30. length = start.distanceTo(end);
    31. changed =false;
    32. }
    33. return length;
    34. }
    35. };//“缓存数据避免重复昂贵的操作时,使影响局部化。”
    36. //DRYdon't repeat yourself
0 0
原创粉丝点击