我有一个文件,其中包含一个 ABNF 语法,带有如下简化示例中的标签:
$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;
$S = $greet $name;
现在的任务是通过解析这个文法的给定句子来获取userID。比如解析句子
Greetings Bob
应该给我们用户 ID 429。语法必须在运行时读入,因为它们可以在运行之间改变。
我现在的做法如下:
将语法解析成一棵或多棵树,将标签放在它们所属的叶子或节点上
用这个/那些树解析句子以构建一个树来创建给定的句子(我正在考虑为此使用 Earley)
使用这棵树来获取标签(不像例子中,这样的树中会有多个不同的标签)
我的问题是,是否有任何软件组件可以使用或至少修改来解决此任务?特别是步骤 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/