2010-06-24 9 views
5

Làm cách nào để xác định bộ làm việc của bộ từ và trình phân tích cú pháp (exempli gratia: flex và bò rừng) để hỗ trợ các chuỗi ký tự thô theo kiểu C++ 0x?Làm thế nào để thực hiện C++ 0x nguyên chuỗi chữ?

Như bạn đã biết, các chuỗi ký tự mới trong C++ 0x có thể được diễn tả một cách rất linh hoạt.

R"<delim>...<delim>"; - trong mã này, <delim> có thể là khá nhiều thứ và cũng không cần ký tự thoát.

Bất kỳ loại dấu ngoặc đơn có thể được sử dụng để phân định cuối chuỗi:

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

khối văn bản có thể được đơn giản định nghĩa bằng sự xuất hiện bình đẳng của cùng một ký tự:

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

More thông tin có thể được tìm thấy here (wikipedia) và here (att).

Tôi muốn sử dụng tính năng tuyệt vời này bằng ngôn ngữ tôi hiện đang phát triển.

Vì vậy, làm cách nào để xác định trình tạo mã thông báo và trình phân tích cú pháp thích hợp để đạt được kết quả?

Cảm ơn trước vì câu trả lời của bạn!

+0

Tôi cho rằng ví dụ thứ hai của bạn không phải là một chữ gốc hợp lệ, nó phải chứa dấu ngoặc đơn (R "(; *** ..."). – Motti

+0

Không, không ... chuỗi; *** ... là một dấu phân cách của một chuỗi, nội dung chuỗi thô bắt đầu sau khi dấu ngoặc đơn – Rizo

+0

Đây là ví dụ từ wikipedia: R "dấu phân tách (Chuỗi dữ liệu \ Stuff") dấu phân cách ". – Rizo

Trả lời

2

Bạn có thể proprocess literals trong giai đoạn phân tích từ vựng và chuyển đổi chúng thành một thứ như thẻ meta.

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

đen [0] là con trỏ đến các văn bản đen gốc.

+0

Bạn có thể xử lý bất kỳ không thường xuyên, cấu trúc cú pháp đặc biệt trong giai đoạn phân tích từ vựng g các chương trình con tùy chỉnh. – 9dan

+0

Đây là loại phân tích ngữ pháp lai lexico-ngữ pháp; Tôi nghĩ rằng tôi hiểu ý tưởng! Cảm ơn bạn! – Rizo