现在是时候来讨论How To Build a Yacc?(1)中的最初提出的问题了。。
如何判断一段代码是否符合预定义的syntax rules,毫无疑问:用你的眼睛和大脑配合也能完成这个任务,或许你还需要一张白纸,以计算syntax rules生成的DFA和stack。但是在有计算机的情况下,谁还会用人脑去代替计算机呢?
用计算机来实现这个功能,有了上面的讨论后,一切似乎很明了:读入syntax rules,生成DFA, 然后读入源代码,运用shift-reduction算法进行识别。
首先要花些时间来考虑用哪种语言来完成这个工作;因为生成DFA需要进行很多集合运算,我选择使用ruby, 如果你不想被那些糟糕的细节拖入地狱,最好用比较高级一点的工具。
在兴奋的往键盘上胡乱敲击代码之前,先转换一下身份,想象自己是这个程序的使用者,该如何调用它?
或许我们会写下如下的代码:
compiler = Compiler.new("syntax.rule", "src")
assert ( compiler.run() == true )
Compiler类ctor有两个参数:语法规则文件syntax.rule, 源代码src。Compiler类还有一个run方法,它用来决定src是否符合syntax.rule定义的规则。true表示符合,false表示不符合。
运行它,不奇怪,它失败了;好象还没写Compiler类呢!
为了使这个test case通过,仅仅为了使它编译通过,写一个Compiler类:
class Compiler
def initialize(rule_file, src_file)
end
def run
return true
end
end
run方法实际上什么也没做,但是足够了,test case已经通过了。一切看起来都很棒,我们迈出相当不错的第一步。
毕竟,现在还没有任何有意义的代码,我们想要点漂亮的东西,就得实实在在的干点活,不是吗?不过我们已经掌握了一个办法:在编写代码前先编写它的测试代码。看起来有点本末倒置,但是一旦你习惯了它,就会觉得这是个非常cool的想法。
测试优先 ---- 来自敏捷方法。
如何判断一段代码是否符合预定义的syntax rules,毫无疑问:用你的眼睛和大脑配合也能完成这个任务,或许你还需要一张白纸,以计算syntax rules生成的DFA和stack。但是在有计算机的情况下,谁还会用人脑去代替计算机呢?
用计算机来实现这个功能,有了上面的讨论后,一切似乎很明了:读入syntax rules,生成DFA, 然后读入源代码,运用shift-reduction算法进行识别。
首先要花些时间来考虑用哪种语言来完成这个工作;因为生成DFA需要进行很多集合运算,我选择使用ruby, 如果你不想被那些糟糕的细节拖入地狱,最好用比较高级一点的工具。
在兴奋的往键盘上胡乱敲击代码之前,先转换一下身份,想象自己是这个程序的使用者,该如何调用它?
或许我们会写下如下的代码:
compiler = Compiler.new("syntax.rule", "src")
assert ( compiler.run() == true )
Compiler类ctor有两个参数:语法规则文件syntax.rule, 源代码src。Compiler类还有一个run方法,它用来决定src是否符合syntax.rule定义的规则。true表示符合,false表示不符合。
运行它,不奇怪,它失败了;好象还没写Compiler类呢!
为了使这个test case通过,仅仅为了使它编译通过,写一个Compiler类:
class Compiler
def initialize(rule_file, src_file)
end
def run
return true
end
end
run方法实际上什么也没做,但是足够了,test case已经通过了。一切看起来都很棒,我们迈出相当不错的第一步。
毕竟,现在还没有任何有意义的代码,我们想要点漂亮的东西,就得实实在在的干点活,不是吗?不过我们已经掌握了一个办法:在编写代码前先编写它的测试代码。看起来有点本末倒置,但是一旦你习惯了它,就会觉得这是个非常cool的想法。
测试优先 ---- 来自敏捷方法。