上一篇文章基本上把分析的过程都讲完了,于是这次就把FpMacro作为一个Demo拿了出来。不第一次就发的原因主要是那个时候FpMacro刚刚写完,当然写完就要用的,于是后来就在Vczh Library++ 3.0的库里面大量使用了FpMacro作为代码生成的一个工具,用来代替一部分的宏的功能。当然最后我并没有写个插件安装到VC++里,而是写了一个批处理文件去调用FpMacro.exe。
【点击
这里下载VL++3.0可配置语法分析器Demo:FpMacro源代码】
FpMacro使用常规的分析方法,首先用可配置语法分析器书写语法,然后连接到一些语义处理函数上生成FpMacro的语法树,最后使用语法树生成虚拟机,然后就可以通过虚拟机来生成代码了。FpMacro被定义为一个专门用来产生字符串结果的语言,最小语法元素自然是字符串连接了。连接两个字符串不需要任何符号,就直接并排着写上去就行了。
当然这里遇到了一些小问题,譬如$loop(10,1,$xyz)和loop(10,1,$xyz)的括号和逗号的意思是不一样的。前者括号和逗号是语法的一部分,后者括号和逗号是字符串的一部分,因此在处理函数调用的参数表达式和函数调用之外的表达式需要两套文法。可配置语法分析器刚好解决了这个问题,因为添加一条语法的代价非常小,因此直接复制那几行做一点小修改就行了。
代码结构如下:
<Library>
基础设施
GenerateCode.bat
(要在Tools\FpMacro.exe编译出来之后才能使用) <Collections>
容器和Linq的代码 <Combinator>
可配置语法分析器代码 <Regex>
正则表达式引擎代码 <Stream>
流系统代码 <UnitTest>
超级迷你实用型单元测试框架,适合单人开发实用 <Tools>
FpMacro.exe
(注意,要将FpMacro的release编译之后产生的exe复制到这里) <FpMacro>
GenerateCode.bat主要用于把Function.f.fpm、Tuple.h.fpm和Event.h.fpm编译成Function.h、Tuple.h和Event.h三个文件,然后产生三个Log文件用来记载fpm文件语法分析的结果,可以检查是否有一些遗漏。
接下来的文章计划写一写关于如何在C++里面模拟C#Linq to Object的语法(编译器写多了就这样了,FQ不要来喷)。语法是一门语言或者库里相当重要的一个部分,直接决定了你写代码的时候的情绪,从而严重影响生产力、效率和代码质量。
posted on 2009-12-12 22:19
陈梓瀚(vczh) 阅读(4915)
评论(0) 编辑 收藏 引用 所属分类:
VL++3.0开发纪事