Frage

Ich habe diese einfache Parser bekam sollen Parse-VB-Stil Doppel-Strings in Anführungszeichen. Somit sollte der Parser drehen etwas wie

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

in eine Ausgabe von

This is a quoted string containing quotes (" ")

Hier ist die Grammatik ich mit dafür kam:

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

Doch das Attribut ich bin immer ein einfaches Anführungszeichen ( "), anstatt die volle geparste Nachricht.

War es hilfreich?

Lösung

Sie können es tun, ohne semantische Aktionen:

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

Die omit[] Richtlinie führt nach wie vor die eingebettete Parser aber aussetzt kein Attribut, so dass die double Regel eine einzige L'"' zurück.

Andere Tipps

Ich glaube, Sie nicht speichern das Ergebnis richtig:

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

Hier wegen des '=' Zeichen, außer Kraft setzen Sie, was bereits in. Versuchen Sie es mit '+ =' statt.

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

Auch ich weiß nicht, ob Spar automatisch ist, können Sie die gleichen hinzufügen müssen ‚+ =‘ nach dem anderen Parser in der Alternative:

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

Aber ich bin nicht so gut mit Qi so vielleicht es automatisiert ist, was Sinn machen würde.

Nun, ich bin nicht ganz sicher, warum, aber ich war in der Lage, es zu beheben, indem Sie diese Zuordnung Aktion in die Unter Regel bewegen:

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

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

Beachten Sie die Verwendung von operator %= für double und die Tatsache, dass die semantische Aktion jetzt dort befindet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top