【问题标题】:Parsing wikimedia markup - are EBNF-based parsers poorly suited?解析维基媒体标记 - 基于 EBNF 的解析器是否不适合?
【发布时间】:2009-07-07 15:31:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: java parsing antlr ebnf wikitext


【解决方案1】:

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

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

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

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

【讨论】:

  • 完美,这就是我正在寻找的答案。谢谢!
【解决方案2】:

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

您必须查看能够回溯以解析 Wiki 的工具

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

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

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

祝你好运

【讨论】:

    【解决方案3】:

    我曾经尝试为Boost.Quickbook 编写一个解析器,它与维基百科使用的维基文本基本相同。

    仅仅为了让一些基础知识发挥作用是一个非常乏味的过程,但我认为最终可以为其编写 EBNF 语法。如果您有兴趣,my partial parser 可在线获取(语法嵌入在文档字符串中)。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2010-10-07
        • 2011-04-22
        • 2011-08-22
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多