zengl v1.0.2版本,该版本修复了语法树扫描模拟栈扩容时的代码BUG,以及修复汇编输出时的BUG。         在parser.c中修复push_TreeStack(int nodenum)时在z...

    zengl v1.0.2版本,该版本修复了语法树扫描模拟栈扩容时的代码BUG,以及修复汇编输出时的BUG。
   
    在parser.c中修复push_TreeStack(int nodenum)时在zl_realloc时参数应该是TREE_STACK_TYPE,而不是TREE_STACK_SIZE的BUG,防止破坏模拟栈 中的数据,之前的版本之所以没有发现这个问题是因为只有当需要扫描的语法树深度很大时才会触发模拟栈扩容,才会报内存错误,本版本的测试脚本 test.zl里面的代码通过给脚本函数70多个参数就可以检测到这个BUG,之前的版本就无法编译此测试脚本。
    在assemble.c中修复+=和-=在gen_codes中的BUG,原来的版本里+=和-=后面如果跟随字符串就会在此BUG中报错,本版本修复此 BUG,这样+=和-=后面就可以直接跟随字符串了,另外修复了gencode_error显示错误信息时显示.zlc的BUG,因为出错的行列号应该是 在.zl的原文件里而不是在.zlc的汇编文件中,最后在之前的版本中输出的汇编代码文件的调试用的注释信息显示的是.zlc的文件名,显然不对,所以本 版本将输出代码调试信息里的.zlc改为.zl的正确文件名。
   
    其他的改动请用 git log -p 或 gitk 等软件查看。
     
    作者:zenglong
    时间:2013年3月3日
    官网:www.zengl.com

    本节v1.0.2版本的源代码下载地址为:http://pan.baidu.com/share/link?shareid=310927&uk=940392313 (此为百度盘的下载地址),访问该地址可以看到三个文件:zengl_lang_v1.0.2_forXP.rar (XP系统下的vs2008解决方案和源代码),zengl_language_v1.0.2_forLinux.tar.gz  (Linux系统下的源代码和makefile) ,v1.0.2-v1.0.0-diffs.txt  (v1.0.2和v1.0.0两个版本之间的代码变化情况)。

   
SourceForge.net上的仓库地址为:https://sourceforge.net/projects/zengl/files/   从里面可以看到各个版本的代码压缩包,比如本节的zengl_lang_v1.0.2_forXP.rar zengl_language_v1.0.2_forLinux.tar.gzv1.0.2-v1.0.0-diffs.txt

    另外这里再提供一个EditPlus编辑器语法高亮文件:
http://pan.baidu.com/share/link?shareid=310971&uk=940392313  和上一节提供的高亮文件相比,本节提供的高亮文件中包含了内建模块和SDL游戏引擎模块中已有的函数,这样就可以将这些函数进行高亮显示。至于stx语法文件的使用方法请参考上一节的内容。

    本节的测试脚本test.zl的代码如下:

use builtin;

test_array = array('青年时种下什么,老年时就收获什么。','易卜生',
        '人并不是因为美丽才可爱,而是因为可爱才美丽。','托尔斯泰',
        '人的美德的荣誉比他的财富的荣誉不知大多少倍。','达·芬奇',
        '人的生命是有限的,可是,为人民服务是无限的,我要把有限的生命,投入到无限的为人民服务之中去。','雷锋',
        '人的天职在勇于探索真理。','哥白尼',
        '人的知识愈广,人的本身也愈臻完善。','高尔基',
        '人的智慧掌握着三把钥匙,一把开启数字,一把开启字母,一把开启音符。知识、思想、幻想就在其中。','雨果',
        '人们常觉得准备的阶段是在浪费时间,只有当真正机会来临,而自己没有能力把握的时候,才能觉悟自己平时没有准备才是浪费了时间。','罗曼.罗兰',
        '人生不是一种享乐,而是一桩十分沉重的工作。','列夫·托尔斯泰',
        '人生应该如蜡烛一样,从顶燃到底,一直都是光明的。','萧楚女',
        '人需要真理,就像瞎子需要明快的引路人一样。','高尔基',
        '任何问题都有解决的办法,无法可想的事是没有的。','爱迪生',
        '如果你希望成功,当以恒心为良友,以经验为参谋,以当心为兄弟,以希望为哨兵。','爱迪生',
        '如果是玫瑰,它总会开花的。','歌德',
        '如果我比笛卡尔看得远些,那是因为我站在巨人们的肩上的缘故。','牛顿',
        '善于利用零星时间的人,才会做出更大的成绩来。','华罗庚',
        '少而好学,如日出之阳;壮而好学,如日中之光;老而好学,如炳烛之明。','刘向',
        '生活便是寻求新的知识。','门捷列夫',
        '生活得最有意义的人,并不就是年岁活得最大的人,而是对生活最有感受的人。','卢梭',
        '生活的理想,就是为了理想的生活。','张闻天',
        '生活的情况越艰难,我越感到自己更坚强,甚而也更聪明。','高尔基',
        '生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识。','左拉',
        '生活最沉重的负担不是工作,而是无聊。','罗曼·罗兰',
        '生命的意义在于付出,在于给予,而不是在于接受,也不是在于争取。','巴金',
        '生命多少用时间计算,生命的价值用贡献计算。','裴多菲',
        '时间,就象海棉里的水,只要愿挤,总还是有的。','鲁迅',
        '时间是伟大的作者,她能写出未来的结局。','卓别林',
        '时间最不偏私,给任何人都是二十四小时;时间也最偏私,给任何人都不是二十四小时。','赫胥黎',
        '世界上最快而又最慢,最长而又最短,最平凡而又最珍贵,最易被忽视而又最令人后悔的就是时间。','高尔基',
        '世有伯乐,然后有千里马。','韩愈',
        '业精于勤而荒于嬉,行成于思而毁于随。','韩愈',
        '天才就是无止境刻苦勤奋的能力。','卡莱尔',
        '聪明出于勤奋,天才在于积累。','华罗庚',
        '坚持意志伟大的事业需要始终不渝的精神。','伏尔泰',
        '走自己的路,让别人去说吧!','阿利盖利·但丁',
        '编程是门艺术','unknown'

        );

for(i=0;i<72;i++)
    print  test_array[i] + '\n\n\t\t ───────────  ' + test_array[++i] + '\n';
endfor

    上面的脚本中使用array(builtin内建模块中的函数)来生成数组,并对其提供了70多个参数,这样就可以迫使语法树的扫描堆栈进行扩容,就可以 测试出BUG了。之前的版本编译此脚本时会因为parser.c中的BUG而弹出内存错误。该脚本在本版本编译后得到的test.zlc运行结果如下:

    最后还是老生常谈的话题:
    windowsXP压缩包中的代码
和测试脚本都是采用GBK的编码,Linux压缩包中的代码以及git里的信息都是UTF8的编码,
所以如果哪些地方出现了乱码,请自行调整(像EditPlus,UltraEdit,linux下的kwrite,vim等都可以调整编 码)。

    对于windows用户,请确保在项目属性的配置里,命令行参数配置的是test.zl(对于zengl_lang_v1.0.2的项目)或
test.zlc(对于zenglrun的项目)。另外工作目录设置为../zengl_lang_v1.0.2  ,这样在zengl_lang_v1.0.2下修改了.zl脚本并重新生成.zlc后,就无需再将.zlc拷贝到zenglrun项目下了。

    另外对于vs2008的用户,我在项目属性里:[配置属性>>>>C/C++ >>>> 高级] 部分设置了禁用特定警告:4013,4715,4996 ,这几个警告会显示一些某某函数是非安全的函数,或者函数没有返回值等,这里禁用掉,防止出现过多的警告。另外还有个警告是显示某某变量没被使用过的, 这个警告我没禁用,可以不用管它。我最开始是在Linux系统中使用eclipse+CDT插件以及gcc等开发的zengl ,在我的GCC下面并没有显示过这些讨厌的警告,所以就没处理,不过还好这些警告都无关痛痒,无需理会。
    还有一个地方:VS2008项目中,在[配置属性>>>> C/C++ >>>> 预处理器] 部分都设置了预处理器定义的宏:OS_IN_WINDOWS,另外在zenglrun开启命令行调试配置中还增加了__ZENGL_DEBUG的宏,主要针对zenglrun的项目 ,之所以需要OS_IN_WINDOWS,是因为源代码既要在WINDOWS下编译,又要在LINUX下编译,所以需要通过这个宏来告诉编译器当前的环境 是windows还是linux,在 windows下面,在程序结束时会执行system ("pause");这条语句(vs2008下为了能看到结果,需要暂停,否则就一闪而过,什么都看不到咯。) 而linux系统主要在bash终端下执行,不需要这条语句,而__ZENGL_DEBUG宏主要用来判断是否需要在zenglrun的目标程序中加入调 试代码。
    Release配置的程序是采用/MT多线程运行时编译的,所以可以直接在别的没有安装调试工具的电脑上运行。

    linux系统下的用户请结合usage.txt的说明,先运行make clean 将原来生成的zengl zenglrun zengldebug和 main.o parser.o assemble.o ld.o func.o run.o debug.o symbol.o builtin.o sdlLib.o文件
删除。

    再运行make all (单纯的make只能生成zengl,所以需要make all来生成所有的目标)

    生成zengl zenglrun
zengldebug 和 main.o parser.o assemble.o ld.o func.o run.o debug.o symbol.o  builtin.o sdlLib.o。(在生成过程中如果出现一些警告,暂不管他)

    最后运行 ./zengl
test.zl 查看printASTnodes函数打印抽象语法树节点的结果,以及符号表输出的变量信息以及函数信息还有
类定义和类成员信息等。(例如变量的内存地址,以及在源文件的行列号,函数的唯一标识ID等)。
    接着运行
./zenglrun test.zlc

    如果要调试脚本则使用./zengldebug test.zlc注意是.zlc结尾的文件名,因为zenglrun虚拟机和zengldebug调试器只能运行.zlc里的汇编代码)。

    zengl语言涉及到的很多高级的编译原理都可以在《龙书》中找到。

    最后的最后,如果转载请注明来源 http://www.zengl.com   , OK , 先到这里,休息,休息一下 O(∩_∩)O~

上下篇

下一篇: zengl编程语言 v1.0.3 完善文件出错信息

上一篇: zengl编程语言 中序

相关文章

zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块

zengl v1.2.5 RC4加密,64位系统及Mac系统编译,Api调用位置规范,内建模块函数

zengl v1.8.2 修复内存泄漏

zengl编程语言v0.0.17单行多行注释

zengl编程语言v0.0.8第二代语法解析函数

zengl v1.3.2 编译静态库 Bug和向下兼容处理