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は、GCC を拡張するための Lisp に似たドメイン固有言語であり、コードを埋め込むことができます。}#

(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 に答える