2011-03-18 4 views
0

을 구문 분석하지 않습니다. 제어 및 제한은 기호 표입니다.치 : 규칙 <그것은 표준 : : 문자열()> 내가 이상한 문제가 입력 문자열

내가 뭘 잘못하고있어?

UPD는 : BOOST_SPIRIT_QI_DEBUG 함께

정의 및 식 전에 BOOST_SPIRIT_DEBUG_NODE (PARAM)와 I 문자열 str을 사용할 경우 다음과 같은 출력 얻었다 : +의 alnum 케이스

<param> 
    <try>WELL name3 PROD OIL </try> 
Segmentation fault 

를 I는 얻었다 :

<param> 
    <try>WELL name3 PROD OIL </try> 
    <success></success> 
    <attributes>[]</attributes> 
</param> 

백 트레이스 :

<param> 
    <try>WELL name3 PROD OIL </try> 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff64db290 in boost::function4<bool, char*&, char* const&, boost::spirit::context<boost::fusion::cons<std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::fusion::nil>, boost::fusion::vector0<void> >&, boost::spirit::unused_type const&>::operator() (this= 
    0x7fffffffd700, [email protected], [email protected], a2=..., a3=...) 
    at /opt/libs/boost/boost/function/function_template.hpp:1013 
1013     (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS); 
+0

여기에서 어떤 일이 일어나고 있는지보기가 조금 어렵습니다. 좀 더 많은 코드를 제공 할 수 있습니까? 가능하면 작은 컴파일 가능한 테스트 케이스입니까? – phooji

+0

예, 시도 할 수있는 최소한이지만 완전한 코드를 제공해주십시오. 예를 들어, param은 어떻게 정의됩니까? – hkaiser

+0

지연 응답을 드려 죄송합니다. 예제 코드 - https://gist.github.com/877743. – W55tKQbuRu28Q4xv

답변

2

문제는 스택에 (생성자 내의 로컬 변수로) 규칙 str을 정의했기 때문입니다. 이 변수는 문법의 생성자가 종료 될 때 범위를 벗어나 param 규칙에 매달린 참조를 남깁니다. str을 문법의 멤버 변수로 이동하면 모든 것이 예상대로 작동합니다.

또한 입력 요소 사이의 공백을 건너 뛰고 싶습니다. phrase_parse API 및 스킵 어 사용 방법을 제안합니다.

+0

오, 내 잘못이야! 작동 해, 고마워! 이제 입력을 토큰 화하기 위해 lex를 사용하려고합니다. – W55tKQbuRu28Q4xv

+0

hkaiser shoots, 그리고 그 점수! :) – phooji