2013-05-12 93 views
0

外來代碼塊我目前正在對工作原理是這樣的玩具語言:一個可以嵌入用這種語言編寫成C++源塊,並在編譯之前,這些塊被轉換成C++中的一個額外的預處理步驟,生成一個有效的C++源代碼。逃離的C++

我想確保這些塊總是可以在源明確,也每當這樣的塊出現在源進行識別,它不能有效C++。此外,我想通過儘可能少地限制嵌入式語言來實現這些目標(語言本身仍然有點流暢)。

最顯而易見的方法是引進一對特殊多字符括號的,由能夠不在有效C++代碼一起出現的字符(或在嵌入式語言)。但是,我不知道如何保證特定的字符序列,給這個目的(不是之後GotW #78,反正(。)

那麼,什麼是逃避這些塊的好方法

+0

有一點需要注意的是[Digraphs and Trigraphs](http://en.wikipedia.org/wiki/Digraphs_and_trigraphs) – 2013-05-12 11:53:57

+1

原始字符串文字可以包含任何字符序列(不包括無效的Unicode序列),所以沒有獨立的字符序列永遠不會出現在C++源代碼中。您將需要編寫一個簡單的C++詞法分析器(或使用預先寫上如[Boost.Wave(http://www.boost.org/doc/libs/1_53_0/libs/wave/)),然後就使用任何不是字面部分並且不是標識符或操作符的字符序列。 – Mankarse 2013-05-12 12:01:55

回答

2

如果?你的編譯器,可向接受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++代碼,除在字符串和註釋)中,用在這樣的宏觀字符串$起始符號(向上非字母或#字符)。

使用#{}#不防呆(因爲原始字符串字面量例如),但不夠好:一個合作用戶可以設法避免。

+0

雖然這並不是我希望它能夠工作的方式。我正在編寫一個轉換器,它能夠接受外部塊,從它們中生成C++,並在預處理器看到任何源代碼之前將它們插回到代碼中。 – xcvii 2013-05-12 12:00:52

+0

熔體做同樣的:它是翻譯MELT語言爲C++(之前並且獨立於C++預處理器的) – 2013-05-12 12:03:11

+0

足夠交易會。我在編輯之前寫了評論,其中添加了關於MELT的部分。編輯:或者,更可能的是,我只是錯過了那部分,對不起! – xcvii 2013-05-12 12:14:45