2009-11-18 35 views
0

我从事一个专注于圣经文本的开源项目。我想创建一个标准的字符串格式来建立一个搜索字符串。然后我需要解析搜索字符串并使用给定的选项运行搜索。有许多不同的选项,从搜索范围,搜索多个文本,到通配符等。C/C++中的搜索字符串解析器

我在想,使用像lex/yacc这样的格式生成解析器可能是件好事理念。我认为Xapian项目使用lemony来实现类似的目标。我的问题是,是否使用这些工具中的一个(或多个)来达到这个目的?

除了这个问题,我希望能够链接到这些工具上的资源(以及任何其他可能是选项的资源)。到目前为止,我遇到的最大问题是大多数示例和教程都是面向编程语言或像计算器那样简单,而不是解析字符串格式。

回答

1

Lex和Yacc等工具适合您的需要。搜索字符串的解析器与编程语言的解析器没有什么不同(最大的不同在于搜索字符串解析器生成规则来指导搜索,而编程语言解析器从生成代码的位置生成解析树)

我假设你的语法将包含类似以下规则:

expression : word 
      | expression AND expression 
      | expression OR expression 
      | NOT expression 
      | '(' expression ')' 

所有这一切都是容易的Yacc来表达。

你可以看一下A Compact Guide to Lex & Yacc我已经找到了学习Lex和Yacc

+0

是的,我需要的规则完全一样的。我仍然不清楚如何从这样的事情中得到结果,例如,用解析结果填充数据结构。接下来的步骤是什么? – 2009-11-18 12:12:59

+0

我并没有要求你给我一步一步的指示,只是想引用一个教程或示例来显示下一步。 – 2009-11-18 12:16:18

+0

我提供的链接将简单的编程语言解析为树。在后面的章节中,他们用它来实现解释器。它应该启发你 – Wernsey 2009-11-18 13:27:38

0

在您的头脑中保留“语法错误诊断和消息”最重要 - 如果用户犯了一个错误,手动递归下降式解析器可以基于它到目前为止扫描的内容有一些想法,用户可能会犯什么错误取得了。如果你打算使用自动化工具,一定要测试它如何响应典型的用户输入错误 - 天才程序员可以处理来自编译器的神秘消息,而这听起来像你瞄准的是一个不太复杂的用户,因此需要一个友好的界面。

1

如果你想建立在C++语法分析器来看看

boost::sprit

它非常有用肯定是先进的C++,但它将从C++模板构建相当复杂和高性能的解析器而无需生成代码。我花了几天时间进入它,但是使用和修改了那些直截了当的样本。我也建议你阅读下面的书籍:

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond by David Abrahams and Aleksey Gurtovoy

+0

我看到了精神。有一点我不清楚的是,结果是否取决于任何提升的DLL。如果不是绝对必要的,我对添加其他依赖关系不是很感兴趣。 – 2009-11-18 12:10:58

+0

否 - 不需要DLL或库。由于大多数提升图书馆精神是一个仅头文件库。没有什么你必须链接。 – 2009-11-18 13:01:21

+0

它会出现,如果你使用正则表达式匹配,我想要的,那么你必须使用boost正规表达式库,这将需要链接,因为它不是头只。感谢您的信息,但我想我会尝试一种不同的解决方案。 – 2009-11-19 20:30:10