我有一个文件,其中包含带有标签的ABNF语法,如下例所示:
$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;
$S = $greet $name;
现在的任务是通过解析此语法的给定句子来获取userID。例如,解析句子
Greetings Bob
应该给我们userID 429.语法必须在运行时读入,因为它们可以在运行之间进行更改。
我现在的方法如下:
将语法解析为一个或多个树,将标记放在它们所属的树叶或节点上
用这个/那些树解析句子来构造一个创建给定句子的树(我正在考虑使用Earley)
使用此树来获取标签(与示例不同,此类树中将有多个不同的标签)
我的问题是,我是否可以使用或至少修改任何软件组件来解决此任务?特别是步骤1和2似乎非常通用(1.将ABNF语法读入C ++内部表示(例如树); 2.早期算法(或类似的东西)使用来自1.)的内部表示并编写第1步的完整,防错的ABNF解析器对我来说将是一项非常耗时的任务。
我知道VoiceXML语法就像这样工作,但我无法为它们找到解析器。基本上我只能找到解析器生成器,它将为单个语法生成C ++代码,这对我来说不实用,因为编译时不知道语法。
有什么想法吗?
答案 0 :(得分:1)
早在2001年,我编写了一个C ++库,它将根据运行时指定的规则生成解析器。它在SourceForge as project BuildParse上提供,具有LGPL许可证。我已经在其他几个项目中使用过它,并且我在2009年更新了它以使用C ++。如果解析器速度很快并不重要,它可能对您有用或者为您节省一些工作。
基本上,你需要一个解析器来解析你的语法到buildparse使用的数据结构(你也可以使用buildparse),然后运行buildparse解析器生成器来生成一个可以识别令牌的东西。