정신으로 이것을 정확하게 구문 분석하려면 어떻게해야합니까?
-
19-08-2019 - |
문제
내 상황 : 저는 정신을 처음 사용하고 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)