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

标签 c++ parsing dynamic runtime grammar

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

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

我遇到的麻烦是如何定义语法并解析它们。我一直在看Boost::Spirit,但是虽然它在读取第一个文件方面做得很好(因为它的规则是预定义的),但我认为它不适用于第二个文件,因为仅定义了Spirit语法编译时无法在运行时加载(至少我理解的是)。

现在,我正在阅读有关ENBF表格的信息,但是我还遇到了一个问题,我不仅拥有语言规则,而且每个对象每次包含在另一个对象中时,每个对象都有一个特定且不同的名称/描述/选项(例如,如果我有对象颜色,则其中的整数将称为red,blue,yello,而如果对象是标尺,则其整数将称为length,所以我也有一种将这些信息包括到文件中的方法,并使它们正确地与相应的值相关联。

您是否有类似项目的外观/研究/用途/用途的指针?
提前致谢。

最佳答案

如果您对文件格式有所限制,则可以考虑使用XML或JSON描述语法。

您可能有一个语法文件,看起来像

{
    "ObjectTypes" : {
        "ruler" : { "properties" : [ "length" ] },
        "color" : { "properties" : [ "red", "green", "blue" ] }
    }
}

读完该文件(很可能使用某个预先存在的库)后,您可以读入另一个包含您实际对象的文件。它可能看起来像这样:
{
    "Objects" : [
        { name : "object1", "type" : "ruler", "length" : 5 },
        { name : "object2", "type" : "color", "red" : 5, "blue" : 127, "green" : 150, }
    ]
}

依此类推。 here为JSON提供了更具描述性的概述,其中包括指向一些处理JSON的C++库的链接(我个人最喜欢的是JsonCpp)。

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

相关文章:

arrays - 如何在 flutter 中解析json?

c# - 如何解析从文本框中以字符串形式传递的Xml值

javascript - CodeIgniter 表单验证,重新填充动态添加的字段

c++ - 找不到用户定义的整数文字

c++ - 使用 Arduino 将字符串转换为 const char* 类型

c++ - Makefile 语法 : Static library lib$(library). a($objects)

c++ - Visual C++ 6.0 和 Visual C++ 2008 有什么区别?

c# - 在 C# 中解析 DirectX 网格文件 (.x)

c# - PdfSharp:动态生成文档

c# - 如何将Json中的自定义节点反序列化为名称不断变化的C#?