9

我正在尝试解析(在 Java 中)在 Wikipedia 上找到的 Wikimedia 标记。有许多现有的包可以完成这项任务,但我还没有找到特别适合我需要的包。我用过的最好的包是Mathclipse Bliki 解析器,它在大多数页面上都做得不错。

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

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

然而,我对 ANTLR 和类似解析器的经验非常有限,因此可能是我的经验不足导致了问题,而不是此类解析器天生就不适合这项任务。在这些主题上有更多经验的人可以在这里权衡吗?

@Stobor:我提到过我查看了各种解析引擎,包括谷歌查询返回的解析引擎。到目前为止,我发现最好的是 Bliki 引擎。问题是用这些解析器解决问题变得非常乏味,因为它们本质上都是长链的条件和正则表达式,导致意大利面条代码。我正在寻找更类似于 EBNF 解析方法的方法,因为该方法更清晰、更简洁,因此更易于理解和发展。我看过你发布的 mediawiki 链接,这似乎证实了我的怀疑,即开箱即用的 EBNF 不适合这项任务。因此,我正在寻找一个像 EBNF 一样清晰易懂的解析引擎,但也能够处理 wiki 标记的混乱语法。

4

4 回答 4

4

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

它在某些意义上类似于解析 C++,除了解析器还处理格式错误的输入和解析器扩展所做的任意语法添加。实际的 mediawiki 实现很像 Perl 5,最初的实现并没有那么糟糕,因为所有的边缘情况都失败了,但是事情是联系在一起的,但实际上让任何后续实现来做同样的事情真的很复杂,特别是因为行为通常是突发的和无证的,不是经过设计的。

如果您不需要 100% 的页面来工作或能够提取所有内容,那么您可以拼凑一些适合您的东西,并且正如您所指出的,有一些软件包可以做到这一点。在不了解您的实际精确需求的情况下,我怀疑任何人都可以为您提供关于如何解析它的更好的答案。如果您需要能够在每个页面上工作并正确解析所有内容,那么您最好拥有一个相当大的团队并工作几年,即使那样您仍然有很多小的边缘案例。

所以简而言之,没有一个 EBNF 语法不适合解析 mediawiki 标记,但实际上没有什么是......

于 2009-07-16T23:07:03.793 回答
3

您是对的,维基媒体不适合 EBNF 定义明确的语法。

您将不得不查看能够回溯以解析 Wiki 的工具

btyacc 这是一个回溯 yacc。 http://www.siber.com/btyacc/

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

或者你可能不得不分解并学习一些你自己的序言和滚动。无论你做什么,你都有一个有趣的学习期在你面前。

祝你好运

于 2009-07-07T15:49:49.527 回答
1

我曾经尝试为Boost.Quickbook编写一个解析器,它与 Wikipedia 使用的 wiki-text 基本相同。

仅仅为了让一些基础知识工作起来,这是一个非常乏味的过程,但我认为最终有可能为它编写 EBNF 语法。如果您有兴趣,我的部分解析器可在线获得(语法嵌入在文档字符串中)。

于 2009-07-07T18:23:13.850 回答
0

这个答案有点悬而未决,但是如何渲染文本然后解析 HTML Dom 以找出不同的 wiki 组件。

于 2009-07-12T23:26:54.850 回答