Разбор сбежавших строк с помощью boost spirit


Я работаю с Spirit 2.4, и я хотел бы разобрать структуру, подобную этой:

Текст{text_field};

Дело в том, что в text_field есть экранированная строка с символами ' { ' ,'} ' и ''. Я хотел бы создать парсер для этого, используя qi. Я пытался это сделать:

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( "\}" );

Но даже не компилируется. Есть идеи?

1 4

1 ответ:

Ваша грамматика может быть записана следующим образом:

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_("\\{}");

То есть

  • за текстом следует Text{ Содержание, за которым следует }

  • content - это по крайней мере один экземпляр либо символ (но не }), либо эсккар

  • escChar - единственный сбежавший \\, {, или }

Обратите внимание, что правилоescChar теперь возвращает один символ и отбрасывает экранирующий \\. Я не уверен, что это то, что вам нужно. Кроме того, я удалил шкипера для правил content и escChar, что позволяет оставить lexeme[] (правило без шкипера действует как неявная лексема).