簡體   English   中英

這個簡單的boost :: spirit :: qi解析器有什么問題?

[英]What is the problem with this simple boost::spirit::qi parser?

我有這個簡單的解析器,用於解析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'"';
    }
};

但是,我得到的屬性是單引號(“),而不是完整的解析消息。

您可以執行此操作而無需任何語義動作:

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

我認為您沒有正確保存結果:

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

在這里,由於有'='符號,您將覆蓋已存在的內容。請改用'+ ='。

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

另外,我不知道保存是否是自動的,您可能必須在另一個解析器之后添加相同的“ + =”:

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

但是我對Qi並不滿意,所以也許它是自動化的,這很有意義。

好吧,我不確定為什么,但是我可以通過將賦值操作移到子規則中來解決它:

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 %= ,並且語義動作現在位於該位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM