05 2008 档案
使用高阶函数开发语法分析器
摘要: 这篇短文的Idea来源于一篇论文。这篇论文的题目是Higier-Order Functions for Parsing,Graham Hutton写的。论文中使用了一种叫Miranda的函数式语言来讲述如何使用高阶函数开发语法分析器。
高阶函数很多语言都支持,譬如JavaScript啊,C#的lambda expression啊,或者是我自己做的语言Vczh Free Script 2.0。不过Miranda是惰性计算的语言,我们常用的语言都不具有惰性计算的特性。因此我阅读了这篇文章之后,自己用Vczh Free Script 2.0写了一个等价的小规模的语法分析器。结构跟论文中所提到的那个有所区别,不过相同的经验可以直接应用在JavaScript里面或其它语言(例如Python等)的lambda expression里。C#我不知道行不行,没去考证。
这里首先要解决一个问题,就是如何引用没被定义的名字的问题。譬如如下文法:
Term=
| "(" Exp ")"
Fa 阅读全文
posted @
2008-05-21 16:57 陈梓瀚(vczh) 阅读(1339) |
评论 (4) 编辑
Vczh Free Script 2.0的Syngram库完成
摘要: 今天在测试封装在FreeScript内的正则表达式接口的时候发现了一个垃圾收集器的Bug,不过很容易就看出来了,于是立刻fix掉。出错的原因在于垃圾收集的时候只标记了运算堆栈的内容,忘了标记调用堆栈的内容。
这个新的Syngram包含了三个工具,分别是正则表达式、词法分析器和语法分析器。
正则表达式分纯、安全和贪婪三种。纯正则表达式仅仅用于匹配,速度非常快(以前的测试表明一秒钟可以匹配44万次),但是没有预查和捕获等功能。安全和贪婪两种正则表达式则是通过不同的搜索方法来匹配字符串的内容,虽然慢了一点,不过有了预查和捕获等功能。之前的文章有提到过关于一个少回溯多捕获的测试用例下的速度。安全分析法回溯将会占用很多时间,而贪婪分析法则回溯基本是没什么消耗的。
词法分析器则可以输入不同的正则表达式,然后将字符串切割成匹配和不匹配的段落,并告诉你匹配的部分实际上是匹配了哪一条正则表达式。这个功能在分析很多字符串的时候都是相当好用的。
至于语法分析器,则是实现了一个上下文无关文法库。语法
阅读全文
posted @
2008-05-19 16:56 陈梓瀚(vczh) 阅读(991) |
评论 (4) 编辑
笔试
posted @
2008-05-13 02:59 陈梓瀚(vczh)|
编辑
Vczh Free Script 2.0中namespace和大部分操作符重载完成!
摘要: 今天上完课回来继续把昨天晚上剩下的using字句完成。使用Syngram写编译器真是舒服啊,直接在代码里面加两条推导式就完成了。昨天发现了InsertEnv指令的bug以后,改过来了。不过InsertEnv不能用在using身上,只好另外写了一个UsingEnv指令,把环境以及上游的链表而不是多个环境插进当前的环境中。这里展示了class和namespace是如何通过闭包(函数)来实现的,以及他们的构造过程。
class以及namespace都是通过在return的跳转目标后添加指令而保证return结束但是不修改class和namespace表达式的返回值。
class函数的参数是父类的构造子,class函数在所有代码之前首先构造好一个父类的链表,然后通过InsertEnv将这个表引用到自己身上,从而实现了正确的scope。然后让constructor为空函数。ClassName.new()的时候首先运行class函数(使用callctor而不是invoke来自动找到父类并添加到参数中),然后复制堆栈,获取construct
阅读全文
posted @
2008-05-12 13:37 陈梓瀚(vczh) 阅读(972) |
评论 (4) 编辑
今天发现了Vczh Free Script 2.0的一个bug
摘要: 今天抓到了一个隐藏了3个月的bug。这个bug以前一直没有被找到,因为以前写的用于测试脚本的代码都没有出现类成员函数使用非全局的外部对象的情况。Vampire.Kiss用我的Vczh Free Script代替PHP开发了一个网站,过程中也向我提了不少要求。其中有一套就是想在脚本中加入namespace。其实这是相当合理的,只是我没想到脚本第一次应用就会被用来开发库。因此今晚就加上了namespace。
实际上在目前的结构中添加namespace并不复杂,因为namespace也可以用闭包来模拟。其实闭包不仅仅是函数,而是一段带了上下文的指令表。因为namespace本身也是用于控制符号在上下文中解释方法工具,因此使用闭包来做也就是十分合适的了。想到以前是用闭包模拟class的时候,曾经实现了一个把一堆环境链接到上下文中的指令。类的继承实际上也是控制符号在类成员函数的符号在上下文解释方法的工具,因此我使用了如下方法来让闭包可以顺利地模拟class的继承:
阅读全文
posted @
2008-05-12 02:07 陈梓瀚(vczh) 阅读(1064) |
评论 (5) 编辑
正则表达式——一点小插曲
摘要: 有个同学近来一直在做一个魔兽世界战况分析(名字好像叫DeusCraft),说是很火。只是用C#觉得不是很爽,想移植到C++上面来。但是那个东西在分析的时候用了好多正则表达式,于是只好找了些正则表达式引擎来测。
测试的文件一共有27万多行,首先通过一个检查时间的正则表达式。如果成功,则在接下来的20几条正则表达式中验证字符串命中哪一条,然后开始做剩余的工作。原先在C#上花了12秒分析,后来换了boost的正则表达式花费40秒,然后从MSR上找了一个号称比boost快4倍的正则表达式引擎,结果还是40秒(都是微软的,咋差距这么大……)。于是同学用他自己做的正则表达式引擎花了23秒(此数据不太记得),我用我以前那个东西花费108秒(-_-|||)。
于是我们这几天就在优化正则表达式引擎,到了今天同学那个花费13秒,我那个12秒。Visual Studio 2008 Team System上有一个Performance Wizard,用于在程序执行的过程中统计各个函数所占用的时间,可以方便定位,看出效率瓶颈,非常好用。
阅读全文
posted @
2008-05-07 21:21 陈梓瀚(vczh) 阅读(2056) |
评论 (14) 编辑
IT项目管理大作业:Tower Defense 2008(最新修改:2008.05.03晚上8点)
摘要: 华南理工大学软件学院本科05级3班,陈梓瀚(vczh)
游戏规则:
1:地图上可以建立三种炮塔塔,游戏有上、左两个敌人的起始点,两个起始点的敌人分别到下、右两个终止点。
2:每一盘有1000个等级分别从1-200的敌人从起始点出发自动寻路前往终止点。如果有10个敌人到达了终止点的话则游戏结束,玩家输。如果所有的敌人都被消灭或到达终止点之后,到达终止点的敌人没有10个的话则游戏结束,玩家赢。
3:建立炮塔的方格敌人不能通过。在建立一个炮塔的时候,如果程序发现这个炮塔的建立会导致敌人找不到任何路径前往各自的终止点的话,则建立被禁止。
4:炮塔可以是用金钱建立或升级,可以卖出货的金钱。消灭敌人能够获得金钱。
5:三种炮塔分别是
·升级后数量变多,射程变长,攻击力变强
·升级后速度变快,射程变长,攻击力变强
·升级后一次爆炸伤害的范围变大,射程变长,攻击力变强
·升级一次后减速范围变大,减速因子变大
6:炮弹在
阅读全文
posted @
2008-05-03 13:46 陈梓瀚(vczh) 阅读(2177) |
评论 (24) 编辑