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?

War es hilfreich?

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.

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