c++ - 在运行时加载语法

标签 c++ parsing dynamic runtime grammar

我正在用 C++ 编写一个项目,我正在寻找一种方法来以人类可读/可写的形式放入文本文件 ( usergrammar.txt ),这是一种定义对象的用户定义语法。

完成此操作后,我希望能够在代码中实例化其中一些对象,并将创建的实例保存在另一个文件 ( instances.txt ) 中,始终以易于访问的格式保存。这第二个文件显然依赖于第一个文件才能被正确读取。

我遇到的问题是如何定义语法并解析它们。我一直在看 Boost::Spirit,但是虽然它可以很好地读取第一个文件(因为它的规则是预定义的),但我认为它不适用于第二个文件,因为 Spirit 语法只被定义编译时无法在运行时加载(至少我是这么理解的)。

现在我正在阅读有关 ENBF 表格的信息,但我也遇到了一个问题,即我不仅有语言规则,而且每个对象每次包含在另一个对象中时都有特定且不同的名称/描述/选项(例如,如果我有对象颜色,它里面的整数将被称为红色、蓝色、黄色,而如果对象是标尺,它的整数将被称为长度),所以我有办法将这些信息包含到文件中以及,并让它们与相应的值正确关联。

对于像这样的项目,您有什么要看/研究/使用/做什么的建议吗? 提前致谢。

最佳答案

参见 Earley parsers它使用从运行时提供的语法中提取的事实来解析上下文无关语言。

另一种方法是利用这样一个事实,即几乎所有 C++ 编译器系统都提供可以派生进程的库。您可以使用它来派生一个 shell 脚本来运行您喜欢的任何解析器生成器方案(包括 Boost:Spirit,需要您从脚本中调用 C++ 编译器,但这并不难)基于任何相应的语法形式,然后拥有该脚本调用生成的解析器。如果您要处理大型文档,这可能比 Earley 解析器更有效。实现起来肯定会容易得多。

关于c++ - 在运行时加载语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10321319/

相关文章:

c++ - 通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?

dynamic - C# ‘dynamic’ 无法访问另一个程序集中声明的匿名类型的属性

c++ - 将LPVOID位图指针转换为QPixmap

C++ 信号和访问 QtQuick 项

unit-testing - 单元测试 Rust Syn crate

parsing - 共享迭代器

python - 无法从 SPAN 标签获取文本

python - 使用 Pyparsing 根据 header 字段解析 CSV 数据

python - 循环的可变长度 - tensorflow

c++ - 如何编译以下程序?