boost spirit 关于复杂表达式的解析

boost spirit是可以根据我们定义的范式进行解析递归解析的库,同时提供了一些action可以对解析出来的数据进行处理。

主要分成两个方面,一个是表达式的解析,另外一个是数据的处理。

表达式子的解析是自己要定义一些范式,告诉spirit解析的规则,规则可以写得很复杂。比如递归之类的相互包涵。

首先需要继承自grammar的类,然后定义几个ruler,然后在definition中填写这些ruler的内容,最后要指定一下从哪个ruler开始解析。 


数据的处理又分成两方面,存储和操作,数据存储和数据操作都是以action的形式在表达式中指定调用的,比如一个简单的四则运算,我们先要在数据出现的位置定义一个存储数据的action,每次获取的数据转化成int后放到一个预选定义好的stack中,然后在每个操作符号(+=*/)出现的在位置定义各自运算的action,这些action刚好用到之前在stack中的数据。  stack在存储的时候push进去,在运算好之后pop,刚好形成了一个深度优先树的遍历过程,完成了带括号的四则运算的解析,真个计算的stack中的最后一个数据也就是实际的运算结果。


资料参考:

最近在弄一个复杂表达式子的解析,首先参考了下面的这个文档,文章介绍的整体软件设计的模式很好,缺点是一切都要从无到有自己来写,时间成本比较高,当然这篇文章还是写得很好的,值得细细的读。http://www.ibm.com/developerworks/cn/java/j-lo-expressparse/index.html?ca=drs-

后来又参考的boost的spirit,http://zh.highscore.de/cpp/boost/parser.html   http://www.cnblogs.com/nemowang/archive/2007/05/11/743155.html,主要参考了这两篇文章,第二篇直接提供了可以运行的示例代码,比较方便。

这个是beyond C++里面的,内容更加全面,代码质量高一些 http://www.oreillynet.com/network/2003/05/06/examples/calculatorexample.html

这个是最新的官方文档,比较全面http://www.boost.org/doc/libs/1_55_0/libs/spirit/classic/doc/grammar.html

还有一些官方的例子,包括上面的计算器的里面都有http://www.boost.org/doc/libs/1_51_0/libs/spirit/example/qi/

你可能感兴趣的:(boost spirit 关于复杂表达式的解析)