首页 > 解决方案 > 使用 boost 元解析字符串解析包含的文件

问题描述

我想在编译时使用 boost Metaparse 来解析 DSL。但是对于分离问题,我不想将我的 DSL 作为一个大字符写入 C++ 文件,而是使用预处理器(可能通过#include)在编译时从单独的文件中获取文本。

boost 元解析文档提到了预处理器宏BOOST_METAPARSE_STRING,因此BOOST_METAPARSE_STRING("DSL content")在预处理器时转换为metaparse::string<'D','S','L',' ', 'c','o'...>

所以而不是

using input = BOOST_METAPARSE_STRING("DSL content");

我想使用类似的东西

using input = BOOST_METAPARSE_STRING(#include "dsl.txt");

dsl.txt 包含

DSL content

但是这种天真的方法行不通,有什么想法吗?

标签: c++boostc-preprocessorc++17

解决方案


如果您不反对在包含的文件中添加一些文本,则可以dsl.txt如下所示:

BOOST_METAPARSE_STRING(r"//(
DSL content
)//");

接着:

using input =
#include "dsl.txt"

(假设您使用的是包含原始字符串的 C++ 版本。否则,它会更烦人。)

如果您愿意,可以使用简单的 shell 命令添加第一行和最后一行。

这并不理想,但由于BOOST_METAPARSE_STRING似乎需要字符串文字,我认为没有更好的选择。


另一方面,如果您发现使用外部预处理器是可以接受的,那么编写一个metaparse::string从文本文件创建模板调用的预处理器一点也不难。您不必将自己限制在 C++ 预处理器中。任何构建工具都允许您使用自定义构建步骤;甚至首先编译您的预处理器以预处理文本文件。


推荐阅读