c++ - 在 C++ 中转义外部代码块

标签 c++ lexer embedded-language

我目前正在研究一种像这样工作的玩具语言:可以将用这种语言编写的 block 嵌入到 C++ 源代码中,并且在编译之前,这些 block 在额外的预处理步骤中被翻译成 C++,生成有效的 C++来源。

我想确保这些 block 始终可以在源代码中明确标识,而且,只要源代码中存在这样的 block ,它就不可能是有效的 C++。此外,我想通过对嵌入式语言施加尽可能少的约束来实现这些(语言本身仍然有些流动)。

显而易见的方法是引入一对特殊的多字符括号,由不能在有效 C++ 代码(或嵌入式语言)中同时出现的字符组成。但是,我不确定如何确保特定的字符序列适合此目的(不是在 GotW #78 之后,无论如何 (:))。

那么逃避这些障碍的好方法是什么?

最佳答案

如果你的编译器可以接受C++11标准,您可以使用原始字符串文字,例如:

  std::cout << R"*(<!DOCTYPE html>
       <html>
       <head>
       <title>Title with a backslash \ here 
     and double " quote</title>)*";

因此,对于原始字符串文字,在这些原始字符串文字中没有禁止的字符序列。任何字符序列都可以出现在其中(但您可以定义原始字符串的结束序列)


你可以像我在 MELT macro-strings 中那样使用 #{}# ; MELT是 Lisp 式的 domain specific language扩展 GCC,您可以在其中嵌入代码,例如

(code_chunk hellocount_chk
            #{ /* $HELLOCOUNT_CHK chunk */ 
                 static int $HELLOCOUNT_CHK#_counter; 
                 $HELLOCOUNT_CHK#_counter++;
               $HELLOCOUNT_CHK#_lab:
                 printf ("Hello World, counted %d\n", 
                         $HELLOCOUNT_CHK#_counter);
                 if (random() % 4 == 0) goto $HELLOCOUNT_CHK#_lab;
            }#)

#{}# 包含宏字符串(这些字符序列不太可能出现在 C 或 C++ 代码中,除了字符串文字和注释中),在此类宏字符串中使用 $ 起始符号(最多为非字母或 # 字符)。

使用 #{}# 并非万无一失(例如,因为原始字符串文字)但足够好:合作用户可以设法避免他们。

关于c++ - 在 C++ 中转义外部代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16507056/

相关文章:

c++ - 创建全局 C++ 对象

javascript - Wing IDE 中的 CoffeeScript 语法高亮显示

python - 停止嵌入式 Python

.net - 嵌入式脚本环境的优点/缺点?

javascript - 哪个 javascript 解释器最容易嵌入到 C 应用程序中?

c++ - C++ VS2010中3n+1溢出的解决方法

c# - Unity,c++ native 插件不匹配的字节数组

parsing - 使用 Free Monad 实现词法分析器

java - JFlex 错误 : Unexpected character: YYINITIAL

c++ - 有没有一种方法可以强制gradle一次只为一个项目编译c++代码(并且只有它)?