2009-07-07 51 views
9

我试图解析(在Java中)维基媒体标记为在维基百科上找到。这项任务有很多现有的软件包,但我没有找到任何适合我需求的特别好的软件包。我与之合作的最好的软件包是Mathclipse Bliki parser,它在大多数页面上都做得不错。解析wikimedia标记 - 是基于EBNF的解析器不太合适吗?

但是,此解析器不完整,无法解析某些页面或在其他页面上错误解析。可悲的是,代码相当混乱,因此修复这个解析引擎中的问题非常耗时且容易出错。

在试图找到一个更好的解析引擎时,我调查了使用基于EBNF的解析器来完成此任务(特别是ANTLR)。但经过一番尝试,似乎这种方法并不是特别适合这项任务,因为维基媒体标记相对宽松,因此不容易适应结构化语法。

但是,我对ANTLR和类似解析器的使用经验非常有限,所以可能是我的经验不足而导致问题,而不是解析器本身不适合执行此任务。任何有这些主题经验的人都可以在这里权衡吗?

@Stobor:我提到过我已经看过各种解析引擎,包括google查询返回的引擎。迄今为止发现的最好的是Bliki发动机。问题在于解决这些解析器的问题变得令人难以置信的乏味,因为它们都基本上是条件和正则表达式的长链,导致了意大利面代码。我在寻找更类似于EBNF解析方法的东西,因为该方法更清晰,更简洁,因而更易于理解和发展。我已经看到了您发布的mediawiki链接,似乎证实了我的怀疑,即EBNF开箱即用并不适合执行此任务。因此,我正在寻找一种解析引擎,它像EBNF一样清晰易懂,但也能够处理维基标记的混乱语法。

+0

这可能是好的,如果你能指出一对夫妇的需求未被满足由http://google.com/search?q=wikipedia+java+parser上的热门搜索结果,因此我们可以提供更好的答案... – Stobor 2009-07-15 05:59:33

+0

另请参见:http://www.mediawiki.org/wiki/Markup_spec/BNF – Stobor 2009-07-15 06:00:45

回答

4

解析任何一般意义上的mediawiki内容几乎是不可能的短的使用mediawiki本身。为了解析它,你需要能够完全解析HTML和CSS(因为它们可以被嵌入),并且处理完整的模板实例化和扩展,以及相关内容可能已经使用的任何解析器添加。该模板实例等同于预处理器。

与解析C++类似,除了解析器还处理格式不正确的输入和解析器扩展所做的任意语法添加。实际的mediawiki实现与Perl 5非常类似,原始实现并不是那么糟糕,因为所有的边缘案例都会掉线,但是事物之间是联系在一起的,但实际上获得后续实现来做同样的事情是非常复杂的,特别是行为往往是紧急和无证的,没有设计。

如果你不需要100%的页面工作或能够提取所有内容,你可能会凑齐一些适合你的东西,正如你已经注意到的那样,有一些包可以做到这一点。不知道你的实际确切需求,我怀疑任何人都可以给你一个关于如何解析它的更好的答案。如果你需要能够在每个页面上工作,并正确解析所有你最好有一个相当大的团队和几年的工作,即使如此,你仍然有很多小的边缘情况。

因此,在短期,没有一个EBNF语法是不适合的mediawiki解析标记,但没有什么是...

3

你是对的维基媒体不适合EBNF定义明确的文法。

你必须看一看将回溯到能够解析维基

btyacc这是一个回溯YACC工具。 http://www.siber.com/btyacc/

你可以看看Accent。比Yacc更好 http://accent.compilertools.net/

或者你可能需要分解和学习一些prolog的风格和你自己的卷。无论你做什么,你都有一段有趣的学习时光。

好运

1

我曾经试着写一个解析器Boost.Quickbook,这在本质上是相同的,通过使用维基百科维基文本。

这是一个非常繁琐的过程,只是为了获得一些基础知识,但我认为最终有可能为它编写EBNF语法。如果您有兴趣,my partial parser可以在线获得(语法嵌入在文档字符串中)。

0

这个答案在那里有一点点,但是如何渲染文本,然后解析HTML Dom以找出不同的wiki组件。