首先定义了一种词法描述格式,并按照它写了某语言的词法规范。
为处理这种词法描述,用JFlex配合CUP为它生成了一个语法分析器,它分析前述的词法描述,产生一个抽象语法树(AST),这样就方便处理词法描述了。
有一个NFA产生器,它遍历那个AST并输出一个NFA。
最后又有一个NFA模拟器,它以从某语言的词法规范得来的NFA和一份该语言源代码为输入,输出词法分析的结果。
真是一个复杂的过程,说清楚可不容易,尤其是我用Java语言实现,所测试的”某语言”又与Java语言相似,期间很多时候都把自己搞得很糊涂。
今天写CUP文件时有个非终结符的产生式全部没有加action。那是一个Statement类的产生式,导致最后语句块的statements()元素全部都是null。CUP生成的文件好大好复杂,跟踪了很久才发现这个弱智的错误,本来想11点就睡觉的,结果拖到现在,都两点了,不过还好找出来了,不然睡觉也不安生。之后又除去一些稍容易定位的bug,目前已经能输出词法分析的结果了,不过还不完善,就等明天了。
似乎又有以前那种找出深藏程序中的bug后喜悦的感觉了。兴奋之余,不禁对那些开发编译器的人肃然起敬,那是多么复杂的脑力劳动!Compiler, lexer generator, parser generator,它们发展的过程中有多少鸡生蛋,蛋生鸡的循环反复呢?我总是很惊奇,看似毫无头绪的技术竟然能总结成一个完整的理论体系,竟然能写出一本不是太难懂的书(Dragon book)。自动机理论、语法分析的体系化方法,多是数学家、计算机专家的杰作。像我这样的人,只能冥思苦想怎么使用它们,也许是天赋,但主要是对待工作的态度所致。
告诫自己,无论如何,学习是最有用的,绝不能在没用的事情上,尤其是游戏,耽误过多的时间。
Leave a Reply