문제

내 상황 : 저는 정신을 처음 사용하고 VC6을 사용해야하므로 Spirit 1.6.4를 사용하고 있습니다.

나는 다음과 같이 보이는 줄이 있습니다.

//The Description;DESCRIPTION;;

나는 텍스트를 넣고 싶다 DESCRIPTION 줄이 시작되면 문자열로 //The Description;.

나는 작동하는 것이 있지만 나에게 그렇게 우아하지는 않습니다.

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+~ch_p(';'))[assign(vDescription)]
    ),
    // End grammar
    space_p).hit)
{
    const string desc(vDescription.begin(), vDescription.end());
}

나는 인쇄 가능한 모든 문자를 다음까지 할당하고 싶습니다. ';' 그러나 다음은 작동하지 않습니다 parse(...).hit == false

parse(chars,
        // Begin grammar
        (
           as_lower_d["//the description;"]
        >> (+print_p)[assign(vDescription)]
        >> ';'
        ),
        // End grammar
        space_p).hit)

내가 어떻게 치게합니까?

도움이 되었습니까?

해결책

사용해 볼 수 있습니다 confix_p:

confix_p(as_lower_d["//the description;"],
         (+print_p)[assign(vDescription)],
         ch_p(';')
        )

그것은 동일해야합니다 프레드의 반응.

코드가 실패한 이유는 때문입니다 print_p ~이다 탐욕스러운. 그만큼 +print_p Parser는 입력의 끝이나 인쇄 할 수없는 문자가 발생할 때까지 문자를 소비합니다. 세미콜론은 인쇄 할 수 있습니다 print_p 그것을 주장합니다. 입력이 소진되고 변수가 지정되고 일치가 실패합니다. 파서의 마지막 세미콜론에는 일치 할 것이 없습니다.

프레드의 답변은 새로운 파서를 구성합니다. (print_p - ';'), 모든 것이 일치합니다 print_p 세미콜론을 제외하고. "제외한 모든 것을 일치시킵니다 엑스, 그런 다음 일치합니다 엑스"일반적인 패턴입니다 confix_p 그런 종류의 파서를 구성하기위한 바로 가기로 제공됩니다. 이 문서는 C- 또는 Pascal 스타일의 의견을 구문 분석하는 데 사용하는 것을 제안하지만 필요하지 않습니다.

코드가 작동하기 위해서는 정신이 욕심이 있음을 인식해야합니다. print_p 너무 많이 일치했습니다 역 추적 덜 일치하는 것을 허용합니다. 그러나 Spirit은 역 추적 할 것이지만, 하위 패러가 탐욕스럽게 일치 할 수있는 "중간"으로 역 추적하지는 않습니다. 다음 "선택 점"으로 역 추적되지만 문법에는 아무것도 없습니다. 보다 철저한 역 추적 및 욕심 Rd 정신 문서에서.

다른 팁

당신은 ';'때문에 인기를 얻지 못합니다. print_p와 일치합니다. 이 시도:

parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+(print_p-';'))[assign(vDescription)]
    >> ';'
    ),
    // End grammar
    space_p).hit)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top