首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中读取/解析带有C++标记的ABNF语法

从文件中读取/解析带有C++标记的ABNF语法
EN

Stack Overflow用户
提问于 2014-10-09 14:36:30
回答 1查看 821关注 0票数 1

我有一个包含ABNF语法的文件,标记类似于这个简化的示例:

代码语言:javascript
复制
$name = Bertha {userID=013} | Bob {userID=429} | ( Ben | Benjamin ) {userID=265};
$greet = Hi | Hello | Greetings;

$S = $greet $name;

现在的任务是通过解析这个语法的给定句子来获得userID。例如,解析句子

代码语言:javascript
复制
Greetings Bob

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

我现在的做法如下:

  1. 将语法解析为一棵或多棵树,将标记放在它们所属的叶子或节点上。
  2. 用这个/那些树解析句子,构造一棵树来创建给定的句子(我正在考虑使用Earley来实现这一点)
  3. 使用此树获取标记(与示例中的不同,这种树中将有多个不同的标记) 我的问题是,是否有任何软件组件,我可以使用或至少修改来解决这个任务?尤其是步骤1和步骤2似乎相当通用(1.将ABNF语法读入C++内部表示(例如树);2.早期算法(或类似的算法)使用1的内部表示)。对于我来说,为步骤1编写一个完整的、防故障的ABNF解析器将是一项非常耗时的任务。

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

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2014-10-09 14:54:00

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26281210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档