2013-11-27 1 views
2

나는 문자열과 부유물을 분석하는 부양 정신 규칙을 만들고 싶습니다.정신이나 명령을 부스트

(str astring)(n 123) 

또는 또 다른 순서로 수 : I 구문 분석하고자하는 문자열은 다음과 같은 형식이

(n 123)(str astring) 

나는 다음과 같은 유형의 속성과 규칙을 만들 싶습니다 :

qi::rule<Iter, std::string(), ascii::space_type> attr; 
attr = lexeme[*alnum]; 

qi::rule<Iter, boost::fusion::vector<std::string, float>, ascii::space_type> hj; 
hj = (
     '(' >> lit("str") >> attr(/*put this at position 0*/) >> ')' 
    | 
     '(' >> lit("n") >> float_[/*put this at position 1*/] >> ')' 
    ); 
:
qi::rule<Iter, boost::fusion::vector<std::string, float>, ascii::space_type> hj; 

는 지금까지 내 코드입니다

분명히, 이것은 컴파일되지 않습니다 (boost는 다른 속성 유형을 공제합니다). 이것을 어떻게 구현할 수 있습니까? 특히 주석이 달린 코드에 무엇을 넣을 수 있습니까?

답변

2

순열 연산자 ^을 사용할 수 있습니다. 최소 작업 예제 :

boost::fusion::vector<std::string,float> ans; 
bool res = phrase_parse(first,last, 
      (lit("(") >> lit("str") >> lexeme[*ascii::alnum] >> lit(")"))^
      (lit("(") >> lit("n") >> float_ >> lit(")")), 
      ascii::space,ans); 

이 솔루션은 here으로 자세히 설명됩니다.

+1

+1. [여기] (http://coliru.stacked-crooked.com/a/4b0a0abfe1669615)는 완전한 예입니다. 순열 파서는 또한 하나의'(n 개의 숫자) '또는 하나의'(str 문자열)'과 채워지는 것이 중요합니다. 누락 된 기본 구성 요소로 채 웁니다. – llonesmiz