使用C ++中的标记从文件中读取/解析ABNF语法

时间:2014-10-09 14:36:30

标签: 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

应该给我们userID 429.语法必须在运行时读入,因为它们可以在运行之间进行更改。

我现在的方法如下:

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

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

  3. 使用此树来获取标签(与示例不同,此类树中将有多个不同的标签)

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

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

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

基本上,你需要一个解析器来解析你的语法到buildparse使用的数据结构(你也可以使用buildparse),然后运行buildparse解析器生成器来生成一个可以识别令牌的东西。