Разбор сбежавших строк с помощью 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 ответ:
Ваша грамматика может быть записана следующим образом:
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[]
(правило без шкипера действует как неявная лексема).