Parsen entkommen Saiten mit Boost Geist
-
26-09-2019 - |
Frage
Ich bin mit dem Geist arbeitet 2.4 und ich würde eine Struktur wie diese analysieren will:
Text {text_field};
Der Punkt ist, dass in text_field ist eine Escape-Sequenzen mit den Symbolen ‚{‘, ‚}‘ und ‚\‘. Ich möchte einen Parser für diese Verwendung von qi erstellen. Ich habe dies versucht:
using boost::spirit::standard::char_;
using boost::spirit::standard::string;
using qi::lexeme;
using qi::lit;
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string(), ascii::space_type > content;
qi::rule< IteratorT, std::string(), ascii::space_type > escChar;
text %=
lit( "Text" ) >> '{' >>
content >>
"};"
;
content %= lexeme[ +( +(char_ - ( lit( '\\' ) | '}' ) ) >> escChar ) ];
escChar %= string( "\\\\" )
| string( "\\{" )
| string( "\\}" );
Aber nicht einmal kompilieren. Jede Idee?
Lösung
Ihre Grammatik geschrieben werden als:
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string() > content;
qi::rule< IteratorT, char() > escChar;
text = "Text{" >> content >> "};";
content = +(~char_('}') | escChar);
escChar = '\\' >> char_("\\{}");
d.
-
text ist
Text{
von Inhalt gefolgt gefolgt von}
-
Inhalt ist mindestens eine Instanz entweder ein Zeichen (aber keine
}
) oder ein escchar -
escchar ist eine einzige entkam
\\
,{
oder}
Beachten Sie die escchar Regel gibt nun ein einzelnes Zeichen und verwirft das entweichende \\
. Ich bin mir nicht sicher, ob das, was Sie brauchen. Zusätzlich entfernte ich den Kapitän für den Inhalt und escchar Regeln, die die lexeme[]
(in der Regel ohne Skipper wirkt wie ein implizites lexem) wegzulassen erlaubt.