2011-06-17 89 views
2

我正在用C++编写一个程序,它将使用与现有的Prolog程序已经使用的相同的输入文件。用C++解析的好方法

这些文件看起来像这样:

expr1(t,[f,g]). 
expr1(q,[]). 
expr1(r,[e]). 

expr2(a). 
expr2(b). 
expr2(e). 

expr2(a,r). 
expr2(b,d). 
expr2(e,z). 

什么是分析这些文件的一些方法?我读过关于Boost Spirit ..任何人都有这个想法?或者是使用标准C/C++库的方式吗?想法会很棒。

谢谢。

+0

定义“纯C++”! Boost库是用C++编写的;他们只是为你做所有的辛苦工作。如果你想从头开始编写你自己的解析器,那就去做吧! –

+0

我会编辑我的帖子:)。我的程序最终将在没有Boost的集群上运行,因此我将不得不请求安装它。所以如果有一个很好的方法,标准的C/C++库会更好。 – ale

+0

由C++标准定义的实际库很薄http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library如果你的集群有任何外部库,似乎加入boost会是一个很好的补充 – totowtwo

回答

2

FlexBison有什么问题?这样做的好处是生成的代码独立于您可能会或可能没有的库。它用于将配置文件解析为诸如Webkit的Javascript解析器之类的东西。您甚至可以找到可以使用的Prolog语法。

+0

标记为解决方案..我只在编译器的开头使用了Flex/Bison,并没有考虑将它们用于这个问题 - 显然真的!谢谢。 – ale

4

这看起来像一个手写递归下降解析器的完美工作。没有额外的依赖关系,易于编写,并且为将来的维护者提供了直接的帮助。

+2

如果您有* C++编程语言*方便,Stroustrup会在第6章中介绍如何编写递归下降解析器。它适用于计算器,但所有步骤都在那里。 – John

1

我绝对不会建议提升精神,除非这个任务真的比它看上去更复杂得多。 Boost Spirit没有什么问题,我的意思是它非常强大,并且能够很好地完成这项工作,但它也需要大量的学习,并且可能会大量增加编译时间。

尽管我同意Jörgen的说法,一个手写体面的解析器将是一个不错的选择,但它看起来并不需要上下文自由的解析器,所以我认为正则表达式解析器可能就足够了。如果是这样的话,我建议你看看新的C++ 0x标准中引入的新的regex库。