2010-06-24 19 views
5

Cómo definir un conjunto de trabajo de lexer y analizador (exempli gratia: flex y bison) para admitir los literales de cadena sin formato con estilo C++ 0x?¿Cómo implementar C++ 0x literal de cadena sin formato?

Como ya sabrá, los nuevos literales de cadenas en C++ 0x pueden expresarse de una manera muy flexible.

R"<delim>...<delim>"; - en este código el <delim> puede ser prácticamente todo y tampoco se necesitan caracteres de escape.

Cualquier tipo de paréntesis, puede ser utilizado para delimitar el final de la cadena:

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

bloques de texto puede ser definida simplemente usando circunstancias igual de los mismos personajes:

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  ) 
    ;***************************"; 

Más la información se puede encontrar here (wikipedia) y here (att).

Me gustaría utilizar esta característica fantástica en un idioma que estoy desarrollando ahora.

Entonces, ¿cómo puedo definir un tokenizador apropiado y un analizador de sintaxis para lograr el resultado?

¡Gracias de antemano por sus respuestas!

+0

Creo que su segundo ejemplo no es un literal en bruto válido, debe contener paréntesis (R "(; *** ..."). – Motti

+0

No, no ... la secuencia; *** ... es un delímetro de una cadena; el contenido de la cadena sin formato comienza después de paréntesis. – Rizo

+0

Aquí está el ejemplo de wikipedia: delimitador "delimitador R" (The String Data \ Stuff ")" – Rizo

Respuesta

2

Puede proprocesar literales en la etapa de análisis léxico y transformarlos en algo así como meta token.

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 { "...." } 

literal [0] es el puntero al texto literal originales.

+0

Puede procesar cualquier no regular, construcciones de sintaxis especiales en la etapa de análisis léxico usin g subrutinas personalizadas. – 9dan

+0

Este es un tipo de análisis híbrido lexico-gramatical; ¡Creo que entendí la idea! ¡Gracias! – Rizo

Cuestiones relacionadas