2017-02-17 6 views
1

경로가 구분 기호로 구분 된 인스턴스 이름 목록 인 인스턴스 이름과 경로를 구문 분석해야하는 문법을 구현하고 싶습니다. 경로가 표시됩니다 전에 분할 될 수 있습니다 .는 입력 파일에 주어진 (기간) 또는 / (슬래시), 예 :Boost spirit : 로컬 변수 값을 변경하여 char_를 구문 분석합니다.

DIVIDER . 
a.b.c 
x.y.z 

일단 설정, 디바이더는 결코 전체 파일에 대한 변경되지 않습니다 (예로 설정하면 ., a/b/c과 같은 경로를 만나면 올바르게 구문 분석해서는 안됩니다.) 사전에 구분선이 무엇인지 알지 못하기 때문에 문법 변수에 저장하고 해당 값인 char_ 파서에서이 값을 사용하는 방법에 대해 생각하고 있습니다. (물론 실제 문법은 훨씬 복잡하지만 내가 문제가있는 부분).

이것은 다소이 질문과 비슷합니다 : Boost spirit using local variables Nabialek 트릭을 사용하면 구분선이 설정된 후 "유효하지 않은"경로를 구문 분석 할 수 있기 때문에 원하는 것은 아닙니다.

여기에 완벽한 해결책을 묻지는 않지만 내 질문은 본질적으로 다음과 같습니다. 내 문법 구성원으로 값을 구문 분석 한 다음이 값을 나머지 입력 구문 분석에 사용할 수 있습니까?

답변

3

내가 상속 된 속성을 사용하십시오 :

qi::rule<It, std::string(char)> element = *~qi::char_(qi::_r1); 
qi::rule<It, std::vector<std::string>(char)> path = element(qi::_r1) % qi::char_(qi::_r1); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path('/'), data); 

은 또한 당신이// 참 로컬 변수에 바인딩 할 수 있습니다 : 동적으로 필요한 경우, boost::phoenix::ref를 사용

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(delim); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(delim); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 

:

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(boost::phoenix::ref(delim)); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(boost::phoenix::ref(delim)); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 
+0

감사합니다. 첫 번째 접근 방식은 거의 비슷하게 보였지만 무한 루프가 발생했습니다. 적어도 나는 그것이 가능하다는 것을 안다. 월요일에 시도하고 다시보고 할 것입니다. – tickferno

+0

예, 훌륭하게 작동합니다. 고마워요! 편집 : 상속 된 특성을 가진 첫 번째 변형을 사용합니다. 나에게 가장 깨끗하고 판독 가능한 솔루션처럼 보입니다. – tickferno