2012-09-01 2 views
1

나는boost :: spirit :: qi 왜 재귀 파서가 예상대로 작동하지 않습니까?

a_end 
a_b_end 
a_b_c_end 

등의 입력을 구문 분석 아래의 문법을 싶습니다하지만 그것은 단지 a_end을 구문 분석하고 하나 이상의 _ 아무것도에 실패합니다. 문법은 다음과 같습니다.

template < typename Iterator > 
struct recursive_parser : qi::grammar<Iterator> 
{ 
    qi::rule<Iterator> start; 
    qi::rule<Iterator> end; 
    recursive_parser() : recursive_parser::base_type(start) 
    { 
     using namespace qi; 
     end = string("_end") | start; 
     start = +(char_ - '_') >> end; 
    } 
}; 

규칙이 반복적으로 사용되도록 설계되지 않았거나 더 명확한 것이 누락 되었습니까?

답변

3
문법으로

, 우리는 다음과 같은 구문 분석을 입력 문자열 a_b_end가 발생

In Start: consume "a". Iterate into end. 
In End: The next part of the string is not "_end", so the first alternative fails. 
      Try the second alternative, which is to iterate into start. 
In Start: The next character is a "_", so start fails. 

그래서 문법이 있어야한다 :

end = string("end") | start; 
start = +(char_ - '_') >> '_' >> end; 
+0

그래, 내 나쁜. 감사. – John

관련 문제