0

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

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

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

那么有什么好方法可以逃脱这些障碍呢?

4

1 回答 1

2

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

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

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


你可以像我在MELT 宏字符串#{中那样使​​用and ;MELT是一种类似 Lisp 的领域特定语言,用于扩展 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++ 代码中,字符串文字和注释除外),这些宏字符串中的#{起始符号(最多为非字母或字符)。}#$#

使用#{and}#并不是万无一失的(例如,因为原始字符串文字),但已经足够好了:合作用户可以设法避免它们。

于 2013-05-12T11:55:37.513 回答