【问题标题】:Is it possible to embed a language into C++ without macros?是否可以在没有宏的情况下将语言嵌入到 C++ 中?
【发布时间】:2018-02-18 08:00:46
【问题描述】:

背景

目前我正在使用 C++ MySQL 连接器与数据库通信,有时我需要通过连接发送硬编码命令。就像很多次一样,我犯了错误/错别字等等。这是一个非常基本的数据库系统课程,因此不涉及任何行业。

问题

是否有可能为另一种语言实现constexpr 编译器,它只运行词法、语法和语义分析并在发现错误时报告错误?或者可能是一些额外的编译步骤?

示例

假设我想发送这个命令:

SELECT * FROM Persons

但是,我忘记输入M

SELECT * FRO Persons

我会在运行时发现问题,如果编译器知道该语言,它可能会被捕获。我解决这个问题的唯一想法是预处理器的疯狂。

在 C++ 中,我会这样称呼它:

auto statement = sql_parse("...");

如果出现问题,希望它会导致编译错误。

【问题讨论】:

  • 最好在错误检查最好的自然环境中检查quires。
  • “如果编译器知道该语言,它可能会被捕获” 你如何期望 c++ 编译器知道 SQL 语言的细节??
  • 您的意思是您的 c++ 代码中的字符串中有 SQL 查询,并希望 c++ 编译器在其中找到 SQL 语法错误?
  • 我认为你不能,据此:stackoverflow.com/questions/7508475/…
  • 嵌入 SQL 通常是通过某种预处理器(通常不是 C 预处理器)完成的 - 请参阅 en.wikipedia.org/wiki/Embedded_SQL

标签: c++ compilation


【解决方案1】:

是否可以为另一种语言实现 constexpr 编译器,只运行词法、语法和语义分析并在发现错误时报告错误?或者可能是一些额外的编译步骤?

不,这在编译时仅使用 C 预处理器/C++ 编译器是不可能的。

您需要实现不同的工具来解析和验证 SQL 代码,并为 SQL 绑定生成必要的 C++ 代码。

auto statement = sql_parse("...");

需要一个在运行时检查 SQL 语句的解析器。


有像 boost::spirit 这样的 C++ 模板工具,允许您在编译时集成 DSL(如 SQL 语法)。这远远超出了 C 预处理器的功能。


对于一个简单实用的解决方案,我建议您在将 SQL 语句应用到 C++ 代码之前,使用适当的工具单独测试您的 SQL 语句。

【讨论】:

  • ""_sql 这样的东西呢,所以它会创建constexpr 对象,函数可以使用它并成为constexpr 本身?
  • 如果没有专门用于捕获内联 SQL 语法的附加 预处理器,我想不出办法。我大致记得使用 c/c++ 代码嵌入 INFORMIX 语句,这需要额外的东西。
  • 通过 CMake 之类的东西添加额外的编译步骤怎么样?它会复制特别标记的字符串,运行编译器,然后崩溃并出现一些有意义的错误?
  • @Incomputable “增加额外的编译步骤怎么样” 这正是我要说的。您将需要一些关于 SQL 绑定内容的额外解析和代码生成。 c 预处理器或 c++ 编译器不会做任何事情。
  • 我很确定答案是错误的。 C++ 模板是图灵完备的。这意味着您几乎可以肯定理论上 实现这一点。只是可能不实用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
相关资源
最近更新 更多