Как реализовать необработанный строковый литерал C ++ 0x? - PullRequest
5 голосов
/ 25 июня 2010

Как определить рабочий набор лексера и парсера ( examplesli gratia: flex and bison) для поддержки необработанных строковых литералов в стиле C ++ 0x?

Как вы, возможно, уже знаете, новые строковые литералы в C ++ 0x могут быть выражены очень гибко.

R"<delim>...<delim>"; - в этом коде <delim> может быть практически всем, а также не требуются escape-символы.

Для ограничения конца строки можно использовать круглые скобки любого типа:

R"(I love those who yearn for the impossible. (Von Goethe, "Faust"))";

Блоки текста могут быть просто определены с использованием одинаковых вхождений одинаковых символов:

R";***************************(
  ; TINY BASIC FOR INTEL 8080  
  ;       VERSION 2.0  
  ;     BY LI-CHEN WANG  
  ; MODIFIED AND TRANSLATED  
  ;    TO INTEL MNEMONICS  
  ;     BY ROGER RAUSKOLB  
  ;     10 OCTOBER, 1976  
  ;       @COPYLEFT  
  ;  ALL WRONGS RESERVED      )
  ;***************************";

Более подробную информацию можно найти здесь (Википедия) и здесь (att).

Я хотел быиспользовать эту фантастическую функцию на языке, который я сейчас разрабатываю.

Итак, как мне определить правильный токенизатор и синтаксический анализатор для достижения результата?

Заранее спасибо за ваши ответы!

1 Ответ

2 голосов
/ 31 декабря 2010

Вы можете обработать литералы на этапе лексического анализа и преобразовать их в нечто вроде мета-токена.

Input:  
    int a;  
    char *b = R"....";  

Preprocessed:  
    int a;
    char *b = R*literal[0]*;

Tokenized:  
    INT symbol[0] DELIM  
    CHAR OP_ASTR symbol[1] OP_EQ symbol[2] *literal[0]* DELIM  

Symbol table contents { "a", "b", "R" }  

Literal table contents { "...." }  

литерал [0] - указатель на исходный текст литерала.

...