2011-02-18 3 views
7

나는 지금까지 표준 boost::spirit::ascii::space/boost::spirit::ascii::space_type 선장을 사용하는 문법이 있습니다. 내가 사용하는 경우Boost Spirit Qi Re-Establish 맞춤 건너 뛰기 문법으로 건너 뛰기

나는

qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression; 
qi::rule<Iterator, PTR<Term>()> term; 

처럼하지 않는 일부 선장을 사용하는 규칙 일부가 아닌 건너 뛰는 비 터미널 (term을 같은) 건너 뛰는 비 터미널 (같은 expression), 모든 내부 예상대로 작동합니다. 공백은 term 비 터미널 내에서만 발생합니다.

또한, 지금까지, 나는 그런

index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]); 

이 방법으로 건너 뛰는 재건 (?)하는 qi::skip를 사용하지 않는 비끝 내부의 선장을 사용 비끝 포함 멋 졌을 공백은 내부 중요하지 않습니다 [] 중괄호가 있지만 바깥 쪽입니다.

그러나 이제는 내 자신의 사용자 지정 선장을 추가하고 싶습니다. (새 행을 중요하게 만들고 나중에 덧글 건너 뛰기를 추가하려고합니다.) 내가

qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression; 

처럼 잘 내 규칙 정의에 추가 할 수 있었다 그러나 나는 나의 건너 뛰기 문법을 사용하는 방법을 알아낼 수 없습니다

struct skip_grammar : qi::grammar<Iterator> { 
    qi::rule<Iterator> start; 
    skip_grammar() : skip_grammar::base_type(start) { 
    start = qi::char_("\t\r "); 
    } 
}; 

:처럼 내 선장 문법 보인다 인수가 qi::skip (그리고 ascii::space을 대체). 유형, 로컬 인스턴스 변수 및 전역 인스턴스 변수를 사용해 보았습니다. 내가 얻은 것 중 가장 멀리있는 것은 skip_grammar가 복사 생성자를 필요로한다는 clang을 얻는 것입니다. 그래서 건너 뛰기 문법에 복사 생성자를 추가하려고 시도했지만 분명히 boost::noncopyable 기본 클래스가 이유가 있습니다. 왜냐하면 내 바이너리가 거의 즉시 segfault되기 때문입니다.

어떻게 사용해야합니까?

감사

답변

7

qi::grammarqi::rules 단지 컨테이너입니다. 실수로 해당 규칙의 오른쪽에있는 파서 식에 매달린 참조를 만들 수 있으므로 복사 생성자가 없습니다.

당신이 원하는대로 선장으로 문법을 사용하는 것은 약간 힘들며 문법의 시작 규칙을 건너 뛰기 파서로 전달하는 것입니다. 이를 위해 규칙 인스턴스를 만드는 것이 더 쉬울 수도 있습니다 (특히 단일 규칙 스키퍼가있는 경우). 어떤 경우

는 규칙 (룰의 멤버 함수 alias()를 호출하여) 참조로 주장을 전달해야 : 단순히

skip_grammar skippper; 
index = '[' >> qi::skip(skipper.start.alias())[explist >> ']']; 

또는 :

rule<iterator> skipper = qi::char_("\t\r "); 
index = '[' >> qi::skip(skipper.alias())[explist >> ']']; 

에일리어싱은 규칙을 복사하는 것이 무엇을 의미하는지에 대한 구체적인 이유가 필요합니다. 자세한 내용은 Spirit의 FAQ here을 참조하십시오.

+0

좋습니다. 모든 멋진 도움에 다시 한 번 감사드립니다. 제쳐두고 문법 대신 규칙을 사용하여 건너 뛰고 있습니까?나는 phrase_parse가 선장을 위해 규칙 유형을 선택했다고 생각하지 않았습니다. – jtolds

+0

구문 분석기 구성 요소는 phrase_parse의 선장으로 활용할 수 있습니다. 제한이 없습니다. – hkaiser

+0

+1, 별칭()은 내가 찾고있는 것이었고 문법에 사용하는 방법을 모르지만 skip()의 시작 규칙에 적용하면 의미가 있습니다! MSVC 진단은 쓸모가 없다. 소스 트레이스가없는 C2248 만 참조하십시오. – namezero