2010-06-24 15 views
5

Come definire un working set di lexer e parser (exempli gratia: flex e bison) per supportare i letterali di stringa raw in stile C++ 0x?Come implementare letteralmente stringa raw C++ 0x?

Come forse già sapete, i nuovi valori letterali di stringa in C++ 0x possono essere espressi in un modo molto flessibile.

R"<delim>...<delim>"; - in questo codice lo <delim> può essere praticamente tutto e non sono necessari caratteri di escape.

Qualsiasi tipo di parentesi può essere utilizzato per delimitare la fine della stringa:

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

blocchi di testo possono essere semplicemente definito usando uguali occorrenze stessi caratteri:

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

Altro le informazioni possono essere trovate here (wikipedia) e here (att).

Vorrei utilizzare questa fantastica funzione in una lingua che sto sviluppando ora.

Quindi, come è possibile definire un tokenizer e un analizzatore di sintassi appropriati per ottenere il risultato?

Grazie in anticipo per le vostre risposte!

+0

Penso che il tuo secondo esempio non sia un letterale raw valido che dovrebbe contenere parentesi (R "(; *** ..."). – Motti

+0

No, no ... la sequenza; *** ... è un delimitatore di una stringa, il contenuto della stringa raw inizia dopo parentesi – Rizo

+0

Ecco l'esempio di wikipedia: R "delimitatore (The String Data \ Stuff") delimitatore ". – Rizo

risposta

2

È possibile proporre i letterali in fase di analisi lessicale e trasformarli in qualcosa come 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 { "...." } 

letterale [0] è il puntatore al testo letterale originale.

+0

È possibile elaborare qualsiasi tipo non regolare, costrutti di sintassi speciali in fase di analisi lessicale g subroutine personalizzate. – 9dan

+0

Questo è un tipo di analisi lessico-grammaticale ibrida; Penso di aver capito l'idea! Grazie! – Rizo