2014-07-11 1 views
1

나는 리스프와 유사한 언어로 따옴표처럼 행동 할 나의 부양 정신 문법에 규칙을 구현하려고합니다.부스트 스피릿 제나라 - 효율적인 쿼트 문법

같은 뭔가 : QUOTE (A B의 C)

아이디어는 QUOTE의 개폐 괄호 사이에 어떤 문자열 리터럴로 캡처 할 것입니다보다는 더 어떤 구문 분석된다.

''('또는') '문자가 QUOTE 안에있을 수 있으므로 '\ " '>> * ~ char _ ('\" ') >>'\ " ' 대신은 끝 견적을 결정하기 위해 괄호를 추적 할 필요가 예를 들어

:. QUOTE (A (BC) d)에 여기에, 나는 내용 "A (BC) D"를 구문 분석 할 것 리터럴 문자열로.

가 나는이 작업을 수행 할 수있는 몇 가지 방법을 생각할 수

가 증가하는 지역 변수를 유지하는 것을 일반적인 생각은/등

을 괄호 깊이를 감소의미 론적 행동의 비효율 때문에 누군가가이 문제에 접근하는 효과적인 방법을 언급하기를 바랍니다.

감사합니다.

+0

어떻게 의미의 행동이 _inefficient_입니까? 컴파일시 번거롭고 느릴 수 있습니다. 그러나 그들은 또한 대개 매우 효율적입니다. (그렇지 않으면 종종 문법입니다.) 그러나 시맨틱 액션의 단점에 대한 [여기] (http://stackoverflow.com/a/8259585/85371) – sehe

답변

3

여기에는 qi::raw[]이 있습니다.

소스 반복기 범위를 노출하므로 복사하거나 구성 할 수 있습니다 (예 : boost::string_ref). 이것보다 훨씬 효율적이지는 않습니다. 예를 들어

:

qi::rule<It, std::string()> demo = 
     qi::raw [ 
      qi::int_ >> '{' >> (qi::double_ % ',') >> '}' 
     ]; 
+1

덕분에,이 매우 직접적인 방법으로 내 문제를 해결합니다. – pt3dNyc