boost spirit是可以根据我们定义的范式进行解析递归解析的库,同时提供了一些action可以对解析出来的数据进行处理。
主要分成两个方面,一个是表达式的解析,另外一个是数据的处理。
表达式子的解析是自己要定义一些范式,告诉spirit解析的规则,规则可以写得很复杂。比如递归之类的相互包涵。
首先需要继承自grammar的类,然后定义几个ruler,然后在definition中填写这些ruler的内容,最后要指定一下从哪个ruler开始解析。
数据的处理又分成两方面,存储和操作,数据存储和数据操作都是以action的形式在表达式中指定调用的,比如一个简单的四则运算,我们先要在数据出现的位置定义一个存储数据的action,每次获取的数据转化成int后放到一个预选定义好的stack中,然后在每个操作符号(+=*/)出现的在位置定义各自运算的action,这些action刚好用到之前在stack中的数据。 stack在存储的时候push进去,在运算好之后pop,刚好形成了一个深度优先树的遍历过程,完成了带括号的四则运算的解析,真个计算的stack中的最后一个数据也就是实际的运算结果。
资料参考:
最近在弄一个复杂表达式子的解析,首先参考了下面的这个文档,文章介绍的整体软件设计的模式很好,缺点是一切都要从无到有自己来写,时间成本比较高,当然这篇文章还是写得很好的,值得细细的读。