我有一个文件,其中包含一个带有标签的 ABNF 语法,如下面的简化示例:
$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;
$S = $greet $name;
现在的任务是通过解析该语法的给定句子来获取用户ID。例如,解析句子
Greetings Bob
应该给我们用户 ID 429。语法必须在运行时读取,因为它们可以在运行之间更改。
我现在的方法如下:
将语法解析为一棵或多棵树,将标签放在它们所属的叶子或节点上
用这个/那些树解析句子以构造一个创建给定句子的树(我正在考虑为此使用 Earley)
使用这棵树来获取标签(与示例不同,这样的树中会有多个不同的标签)
我的问题是,我可以使用或至少修改任何软件组件来解决此任务吗?特别是第 1 步和第 2 步似乎非常通用(1. 将 ABNF 语法读入 C++ 内部表示(例如树);2. 使用 1. 的内部表示的早期算法(或类似的东西)并编写步骤 1 的完整、防错 ABNF 解析器对我来说将是一项非常耗时的任务。
我知道 VoiceXML 语法是这样工作的,但我无法为它们找到解析器。基本上我能找到的只是解析器生成器,它们将为单个语法生成 C++ 代码,这对我来说不实用,因为在编译时语法是未知的。
有任何想法吗?