1

我有一个文件,其中包含一个带有标签的 ABNF 语法,如下面的简化示例:

$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;

$S = $greet $name;

现在的任务是通过解析该语法的给定句子来获取用户ID。例如,解析句子

Greetings Bob

应该给我们用户 ID 429。语法必须在运行时读取,因为它们可以在运行之间更改。

我现在的方法如下:

  1. 将语法解析为一棵或多棵树,将标签放在它们所属的叶子或节点上

  2. 用这个/那些树解析句子以构造一个创建给定句子的树(我正在考虑为此使用 Earley)

  3. 使用这棵树来获取标签(与示例不同,这样的树中会有多个不同的标签)

    我的问题是,我可以使用或至少修改任何软件组件来解决此任务吗?特别是第 1 步和第 2 步似乎非常通用(1. 将 ABNF 语法读入 C++ 内部表示(例如树);2. 使用 1. 的内部表示的早期算法(或类似的东西)并编写步骤 1 的完整、防错 ABNF 解析器对我来说将是一项非常耗时的任务。

我知道 VoiceXML 语法是这样工作的,但我无法为它们找到解析器。基本上我能找到的只是解析器生成器,它们将为单个语法生成 C++ 代码,这对我来说不实用,因为在编译时语法是未知的。

有任何想法吗?

4

1 回答 1

1

早在 2001 年,我编写了一个 C++ 库,它将根据运行时指定的规则生成解析器。它在SourceForge 上作为具有 LGPL 许可证的项目 BuildParse提供。我已经在其他几个项目中使用过它,并且从 2009 年起我将它更新为与 C++ 一起使用。如果解析器是否快速无关紧要,它可能对您有用,或者为您节省一些自己的工作。

基本上,您需要一个解析器将您的语法解析为 buildparse 使用的数据结构(您也可以使用 buildparse),然后运行 ​​buildparse 解析器生成器来生成可以识别标记的东西。

于 2014-10-09T14:54:00.163 回答