나는 지금까지 표준 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되기 때문입니다.
어떻게 사용해야합니까?
감사
좋습니다. 모든 멋진 도움에 다시 한 번 감사드립니다. 제쳐두고 문법 대신 규칙을 사용하여 건너 뛰고 있습니까?나는 phrase_parse가 선장을 위해 규칙 유형을 선택했다고 생각하지 않았습니다. – jtolds
구문 분석기 구성 요소는 phrase_parse의 선장으로 활용할 수 있습니다. 제한이 없습니다. – hkaiser
+1, 별칭()은 내가 찾고있는 것이었고 문법에 사용하는 방법을 모르지만 skip()의 시작 규칙에 적용하면 의미가 있습니다! MSVC 진단은 쓸모가 없다. 소스 트레이스가없는 C2248 만 참조하십시오. – namezero