1

VBスタイルの二重引用符で囲まれた文字列を解析することを目的としたこの単純なパーサーがあります。したがって、パーサーは次のようになります。

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

の出力に

This is a quoted string containing quotes (" ")

これが私がこれのために思いついた文法です:

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'"';
    }
};

ただし、取得している属性は、完全に解析されたメッセージではなく、一重引用符( ")です。

4

3 に答える 3

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'"'ます。

于 2010-06-30T15:58:26.310 に答える
1

結果を適切に保存していないと思います。

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

ここでは、「=」記号があるため、すでに入っていたものをオーバーライドします。代わりに「+=」を試してください。

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

また、保存が自動であるかどうかはわかりません。代わりに、他のパーサーの後に同じ「+=」を追加する必要がある場合があります。

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

しかし、私はQiがあまり得意ではないので、おそらく自動化されているので、それは理にかなっています。

于 2010-06-30T06:51:22.140 に答える
1

理由はよくわかりませんが、その割り当てアクションをサブルールに移動することで修正できました。

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

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

operator %=for doubleQuoteの使用と、セマンティックアクションがそこに配置されていることに注意してください。

于 2010-06-30T14:44:09.917 に答える