2010-06-30 3 views
1

VB 스타일의 큰 따옴표 붙은 문자열을 구문 분석하기위한 간단한 파서가 있습니다. 그러나이 간단한 boost :: spirit :: qi 파서의 문제점은 무엇입니까?

namespace qi = boost::spirit::qi; 
namespace wide = qi::standard_wide; 
class ConfigurationParser : public qi::grammar<std::wstring::iterator, std::wstring()> 
{ 
    qi::rule<std::wstring::iterator, std::wstring()> quotedString; 
    qi::rule<std::wstring::iterator> doubleQuote; 

public: 
    ConfigurationParser() : ConfigurationParser::base_type(quotedString, "vFind Command Line") 
    { 
     doubleQuote = (wide::char_(L'"') >> wide::char_(L'"')); 

     quotedString = L'"' >> +(doubleQuote[qi::_val = L'"'] | (wide::char_ - L'"'))>> L'"'; 
    } 
}; 

, 내가 '속성 : 따라서, 파서가 여기에

This is a quoted string containing quotes (" ") 

의 출력에

"This is a quoted string containing quotes ("" "")" 

같은 것을 설정해야 내가 이것에 대한 내놓았다 문법이다 get은 전체 구문 분석 된 메시지가 아닌 작은 따옴표 (")입니다.

답변

4

당신은 어떤 의미 조치없이 작업을 수행 할 수 있습니다

class ConfigurationParser 
    : public qi::grammar<std::wstring::iterator, std::wstring()> 
{ 
    qi::rule<std::wstring::iterator, std::wstring()> quotedString; 
    qi::rule<std::wstring::iterator, wchar_t()> doubleQuote; 

public: 
    ConfigurationParser() 
     : ConfigurationParser::base_type(quotedString, "vFind Command Line") 
    { 
     doubleQuote = wide::char_(L'"') >> omit[wide::char_(L'"')]; 
     quotedString = L'"' >> +(doubleQuote | (wide::char_ - L'"')) >> L'"'; 
    } 
}; 

omit[] 지시어는 여전히 포함 된 파서를 실행하지만 doubleQuote 규칙이 하나의 L'"'를 반환하고, 모든 속성을 노출하지 않습니다.

1

제대로 결과를 저장하지 않습니다 때문에 '='기호로, 여기

doubleQuote[qi::_val = L'"'] 

을, 당신은 이미 무엇 오버라이드 (override) 대신 '+ ='로보십시오..

doubleQuote[qi::_val += L'"'] 

또한, 나는 절약 자동 경우, 추가 할 수 있습니다 모르는 같은 '+ ='대안의 다른 파서 후 :

(wide::char_ - L'"')[qi::_val += boost::spirit::arg_names::_1] 

하지만하지 그입니다 제나라와 잘 어울릴 것 같아 아마도 아마 자동화 될 것입니다.

+0

'std :: wstring'에는 'wchar_t'에서 할당 한 멤버가 없다는 것을 제외하면 일종의 의미가 있습니다 ... –

+0

맞아요. 아마 꺼져 버렸을 것입니다. –

1

글쎄, 내가 왜 완전히 모르겠지만, 하위 규칙에 해당 할당 조치를 이동하여 문제를 해결할 수 있었다 :

doubleQuote %= (wide::char_(L'"') >> L'"')[qi::_val = L'"']; 
doubleQuote.name("double quote"); 

quotedString = L'"' >> +(doubleQuote | (wide::char_ - L'"')) >> L'"'; 
quotedString.name("quoted string"); 

주 doubleQuote에 대한 operator %=의 사용과 사실 그 의미 론적 행동이 여기에 위치합니다.

관련 문제