Разборки сбежавшие струны с Boost Spirit
-
26-09-2019 - |
Вопрос
Я работаю с 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( "\\}" );
Но даже не скомпилируется. Есть идеи?
Решение
Ваша грамматика может быть написана как:
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{
с последующим контентом, а затем}
содержание по крайней мере один экземпляр любого символа (но нет
}
) или esccharescchar. один сбеженный
\\
,{
, или}
Обратите внимание escchar. Правило теперь возвращает один символ и отбрасывает выход \\
. Отказ Я не уверен, что это то, что вам нужно. Кроме того, я удалил шкипер для содержание и escchar. правила, что позволяет оставлять lexeme[]
(правило без шкипера действует как неявная лексемия).