Squashed 'third_party/boostorg/property_tree/' content from commit bdfe275
Change-Id: I075a5e242aaddc356ecc81e756c4a0907fc38130
git-subtree-dir: third_party/boostorg/property_tree
git-subtree-split: bdfe275d172ac30bc5e89a6375a5a64dea20b3c0
diff --git a/examples/info_grammar_spirit.cpp b/examples/info_grammar_spirit.cpp
new file mode 100644
index 0000000..0702534
--- /dev/null
+++ b/examples/info_grammar_spirit.cpp
@@ -0,0 +1,152 @@
+// ----------------------------------------------------------------------------
+// Copyright (C) 2002-2006 Marcin Kalicinski
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see www.boost.org
+// ----------------------------------------------------------------------------
+
+/* This is grammar of INFO file format written in form of boost::spirit rules.
+ For simplicity, it does not parse #include directive. Note that INFO parser
+ included in property_tree library does not use Spirit.
+*/
+
+//#define BOOST_SPIRIT_DEBUG // uncomment to enable debug output
+#include <boost/spirit.hpp>
+
+struct info_grammar: public boost::spirit::grammar<info_grammar>
+{
+
+ template<class Scanner>
+ struct definition
+ {
+
+ boost::spirit::rule<typename boost::spirit::lexeme_scanner<Scanner>::type> chr, qchr, escape_seq;
+ boost::spirit::rule<Scanner> string, qstring, cstring, key, value, entry, info;
+
+ definition(const info_grammar &self)
+ {
+
+ using namespace boost::spirit;
+
+ escape_seq = chset_p("0abfnrtv\"\'\\");
+ chr = (anychar_p - space_p - '\\' - '{' - '}' - '#' - '"') | ('\\' >> escape_seq);
+ qchr = (anychar_p - '"' - '\n' - '\\') | ('\\' >> escape_seq);
+ string = lexeme_d[+chr];
+ qstring = lexeme_d['"' >> *qchr >> '"'];
+ cstring = lexeme_d['"' >> *qchr >> '"' >> '\\'];
+ key = string | qstring;
+ value = string | qstring | (+cstring >> qstring) | eps_p;
+ entry = key >> value >> !('{' >> *entry >> '}');
+ info = *entry >> end_p;
+
+ // Debug nodes
+ BOOST_SPIRIT_DEBUG_NODE(escape_seq);
+ BOOST_SPIRIT_DEBUG_NODE(chr);
+ BOOST_SPIRIT_DEBUG_NODE(qchr);
+ BOOST_SPIRIT_DEBUG_NODE(string);
+ BOOST_SPIRIT_DEBUG_NODE(qstring);
+ BOOST_SPIRIT_DEBUG_NODE(key);
+ BOOST_SPIRIT_DEBUG_NODE(value);
+ BOOST_SPIRIT_DEBUG_NODE(entry);
+ BOOST_SPIRIT_DEBUG_NODE(info);
+
+ }
+
+ const boost::spirit::rule<Scanner> &start() const
+ {
+ return info;
+ }
+
+ };
+};
+
+void info_parse(const char *s)
+{
+
+ using namespace boost::spirit;
+
+ // Parse and display result
+ info_grammar g;
+ parse_info<const char *> pi = parse(s, g, space_p | comment_p(";"));
+ std::cout << "Parse result: " << (pi.hit ? "Success" : "Failure") << "\n";
+
+}
+
+int main()
+{
+
+ // Sample data 1
+ const char *data1 =
+ "\n"
+ "key1 data1\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "key2 \"data2 \" {\n"
+ "\tkey data\n"
+ "}\n"
+ "key3 \"data\"\n"
+ "\t \"3\" {\n"
+ "\tkey data\n"
+ "}\n"
+ "\n"
+ "\"key4\" data4\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "\"key.5\" \"data.5\" { \n"
+ "\tkey data \n"
+ "}\n"
+ "\"key6\" \"data\"\n"
+ "\t \"6\" {\n"
+ "\tkey data\n"
+ "}\n"
+ " \n"
+ "key1 data1\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "key2 \"data2 \" {\n"
+ "\tkey data\n"
+ "}\n"
+ "key3 \"data\"\n"
+ "\t \"3\" {\n"
+ "\tkey data\n"
+ "}\n"
+ "\n"
+ "\"key4\" data4\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "\"key.5\" \"data.5\" {\n"
+ "\tkey data\n"
+ "}\n"
+ "\"key6\" \"data\"\n"
+ "\t \"6\" {\n"
+ "\tkey data\n"
+ "}\n"
+ "\\\\key\\t7 data7\\n\\\"data7\\\"\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "\"\\\\key\\t8\" \"data8\\n\\\"data8\\\"\"\n"
+ "{\n"
+ "\tkey data\n"
+ "}\n"
+ "\n";
+
+ // Sample data 2
+ const char *data2 =
+ "key1\n"
+ "key2\n"
+ "key3\n"
+ "key4\n";
+
+ // Parse sample data
+ info_parse(data1);
+ info_parse(data2);
+
+}