Вопрос

Я работаю с 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{ с последующим контентом, а затем }

  • содержание по крайней мере один экземпляр любого символа (но нет }) или escchar

  • escchar. один сбеженный \\, {, или }

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top