【转】Vczh Library++3.0之可配置语法分析器(前言)
从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。 祝大家学习愉快,做自己的爱好 ^_^ !
花了差不多两个星期的时间将一个可配置语法分析器(Combinator)写好了。这个语法分析器被设计来完成以下任务:
1、易于使用,并且在运行时可更改
2、提供对分析字符串和容器的支持
3、可使用正则表达式辅助定义分析器
4、如果觉得预定义的设备不满意,用户可以自行提供新的文法元素(譬如说增加一种使用通配符进行语法分析的元素)
5、提供可配置错误恢复策略,提供合理的错误发生位置信息,用户可根据自己的意愿来决定错误信息的内容。
不过直接写这玩意儿怎么开发出来的比较枯燥,所以这里我准备了一个Demo,也是我自己正在使用的,FpMacro。
FpMacro跟C++的宏差不多,不过主要区别是,宏本身再也不被当成字符串替换的工具,而是一个生成字符串的函数。于是你可以将一个宏当成函数指针传进另一个宏,形成高级的功能。举个例子:
2 $$define $TEMPLATE_LIST($count) $loopsep($count,0,$TEMPLATE_ITEM,$(,))
3 $TEMPLATE_LIST(3)
上面的FpMacro代码将产生“typename T0,typename T1,typename T2”。使用FpMacro再也不需要任何C++宏里面的恶心技巧(譬如为了让两段代码得以链接你需要双重包装,类似#define _(X) __(X) ; #define __(X) #X),再也不需要为循环产生代码费心思,再也不用考虑宏的替换顺序,一切都变得井然有序。
FpMacro是可配置语法分析器的Demo,然而Function.f.fpm(这是一个在以后会上传的FpMacro代码文件)则是FpMacro的Demo。Function.f.fpm产生了一段支持0-10个参数的functor、参数绑定和函数组合的代码,可以认为functor跟tr1::function的功能基本一致。通过这个例子可以更加形象地体会FpMacro的高级功能。在接下来的系列文章中,我将会通过分析FpMacro,将FpMacro的运行过程详细剖析,让大家明白可配置语法分析器每一个设计细节的原因,并告诉大家如何实现可配置语法分析器。