2011-03-22 3 views
2

이것은 아마도 단순한 구조체를 구문 분석하기 위해 QI를 성공적으로 사용해 왔고 아마도 이미 알고있을 것입니다.Boost :: Spirit :: Qi 자동 규칙 및 조건부 동작

struct GenderTally 
{ 
std::vector<std::string> males; 
std::vector<std::string> females; 
}; 

나타 특정 카테고리의 객체와

m:Steve; 
f:Dora; 
f:Martha; 
m:Joe; 
... 

등의 입력 파일 :하지만

이의 우리가 같은 컨테이너 있다고 가정 해 봅시다 ...에 관계없이 저를 회피한다 모든 순서대로 나열해야하며 모든 객체가 표시되지 않을 수도 있습니다.

여기에서 퓨전 적용은 건너 뛸 것이지만 두 개의 문자열 벡터가됩니다.

제 문제는 그런 조건부 컨테이너를 채우는 문법을 작성하는 것입니다. 지금까지 특수 문법을 사용할 때마다 입력을 여러 번 구문 분석하여이 문제를 해결했습니다. 이 예에서는 남성과 여성이됩니다.

QI 미니 XML 튜토리얼에서 자동 규칙이 의미 론적 동작을 제거한다는 인상을 받았지만 필자는 신인이며 QI 사용과 같은 하드 코어 (템플릿) 마법 API에 여전히 겁을 먹었다. 그래도, 그것이 나쁘다는 것을 알고 있더라도, 나쁜 형식 ... 나는 헤드 라이트 막힘에서 주요 사슴을 경험하고 있기 때문에 여기에 실제 실제 예를 얻게되어 매우 감사 할 것입니다. 편집 : 자동 규칙을 사용하는 문법의 실용적인 예이며 적절한 버킷에 물건을 넣습니다.

답변

5

은 내가 귀하의 경우에 할 줄 것은 이것이다 :

BOOST_FUSION_ADAPT_STRUCT(
    GenderTally, 
    (std::vector<std::string>, males) 
    (std::vector<std::string>, females) 
); 

rule<Iterator, std::string()> r = +alnum; 
rule<Iterator, GenderTally()> g = 
    *( ("f:" >> r)[phx::push_back(at_c<0>(_val), _1)] 
    | ("m:" >> r)[phx::push_back(at_c<1>(_val), _1)] 
    ); 

좋은,하지만 여전히 당신은 무엇을 처리 할 수있는 가장 쉬운 방법이 아니다.

rule<Iterator, std::string()> r = +alnum; 
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r); 

을하지만 우리는 수정의 많은에이 전용으로이 코드는 SVN 트렁크 작동 할 수 :

당신이

struct Gender { 
    char gender; 
    std::string name; 
}; 

typedef std::vector<Gender> GenderTally; 

BOOST_FUSION_ADAPT_STRUCT(
    Gender, 
    (char, gender) 
    (std::string, name) 
); 

같은 다른 데이터 구조를 가지고 있다면 당신은 그것을 다르게 쓸 수 속성 처리는 최근에 커밋되었습니다.

단점은 남성과 여성을 구분하기 위해 별도의 후 처리 단계가 필요하다는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 네, 지금까지 두 번째 접근법 인 간단한 구조체와 별도의 후 처리 단계를 사용했습니다. 나는 그런 기본적으로 사소한 문제가 똑같이 사소한 것으로 해결 될 수 있는지 궁금해하고 있었고, 접근법 1은 사소한 것처럼 보이지만 실용적으로는 여전히 내 머리 위로 넘깁니다. 그래서, 복잡한 파서조차도 거의 항상 그렇다는 가정하에 나는 맞습니까? 파싱 ​​만하고 계산과 같은 일은 후 처리를 대신 사용합니까? – Erius

관련 문제