2010-06-24 3 views
5

C++ 0x 스타일의 원시 문자열 리터럴을 지원하기 위해 lexer 및 구문 분석기 (예시 : flex 및 bison)의 작업 집합을 정의하는 방법은 무엇입니까?C++ 0x 원시 문자열 리터럴을 구현하는 방법은 무엇입니까?

C++ 0x의 새로운 문자열 리터럴은 매우 유연한 방식으로 표현 될 수 있습니다.

R"<delim>...<delim>"; -이 코드에서 <delim>은 거의 모든 것이 될 수 있으며 이스케이프 문자도 필요하지 않습니다.

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

더 : 텍스트의

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

블록은 단순히 동일한 문자의 동일한 항목을 사용하여 정의 할 수 있습니다

괄호 모든 종류의 문자열의 끝을 구분하는 데 사용 할 수 있습니다 정보는 here (위키 백과) 및 here (att)입니다.

나는 지금 개발중인 언어로이 환상적인 기능을 사용하고 싶습니다.

그렇다면 결과를 얻기 위해 적절한 토크 나이저와 구문 분석기를 어떻게 정의 할 수 있습니까?

미리 답변 해 주셔서 감사합니다.

+0

두 번째 예제는 괄호 (R "(; *** *** ...")을 포함해야하는 유효한 원시 리터럴이 아닌 것 같습니다.) – Motti

+0

아니요, 아니요 ... 시퀀스 ... *** ... is 문자열의 delimeter, 문자열의 괄호 안의 내용은 괄호 뒤에 나온다. – Rizo

+0

위키 피 디아의 예제는 다음과 같다 : R "구분자 (문자열 데이터 \ 항목)"구분자. – Rizo

답변

2

어휘 분석 단계에서 리터럴을 처리하고 메타 토큰과 같은 것으로 변환 할 수 있습니다.

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]는 일본어 문자 텍스트 포인터이다.

+0

비정규, 어휘 분석 단계의 특수 구문 구문 g 사용자 정의 서브 루틴. – 9dan

+0

이것은 하이브리드 lexico 문법 분석의 일종입니다. 나는 그 생각을 이해했다고 생각한다! 고맙습니다! – Rizo

관련 문제