c++ - 从文件中读取/解析带有 C++ 标签的 ABNF 语法

标签 c++ parsing tags grammar abnf

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

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

$S = $greet $name;

现在的任务是通过解析这个文法的给定句子来获取userID。比如解析句子

Greetings Bob

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

我现在的做法如下:

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

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

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

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

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

有什么想法吗?

最佳答案

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

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

关于c++ - 从文件中读取/解析带有 C++ 标签的 ABNF 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281210/

相关文章:

c# - 使用 CsvHelper 可以将空格转换为可为 null 吗?

java - 在 Java 中解析 JSON 数据

PHP strip_tags : allows <br/>?

mysql - 选择相关的元素属性作为字符串

iphone - iPad 上的假 "user initiated"<audio> 标签

c++ - 如何在 C++ 中的多个操作系统上播放声音文件?

c++ - 网络编程入门 - PlayBook

C++:使用另一个类中的参数初始化对象数组

c++ - 如何获取字体数据以嵌入到 PDF 中?

c# - 如何从字符串C#获取自定义类的类型