From 9cd260840648d63bd4c31d90c81a462361cf896a Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Thu, 2 Apr 2020 16:42:35 +0200 Subject: [PATCH] Allow comments in scraplang. Re-use the ini comment skipper I wrote for kamokan. Comments are the same as ini files in scraplang, use # --- src/scraplang/parse.cpp | 6 ++++-- src/scraplang/scrapgrammar.hpp | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/scraplang/parse.cpp b/src/scraplang/parse.cpp index 9005f65..4ab827e 100644 --- a/src/scraplang/parse.cpp +++ b/src/scraplang/parse.cpp @@ -67,12 +67,14 @@ BOOST_FUSION_ADAPT_STRUCT( ) namespace duck { namespace sl { + typedef kamokan::IniCommentSkipper skipper_type; + std::vector parse (std::string_view parData) { - ScrapGrammar gramm; + ScrapGrammar gramm; auto it_start = parData.cbegin(); std::vector retval; - const bool ok = qi::phrase_parse(it_start, parData.cend(), gramm, sp::ascii::blank, retval); + const bool ok = qi::phrase_parse(it_start, parData.cend(), gramm, skipper_type(), retval); std::cout << "parse ok: " << std::boolalpha << ok << '\n'; std::cout << "end == it: " << std::boolalpha << (parData.cend() == it_start) << '\n'; diff --git a/src/scraplang/scrapgrammar.hpp b/src/scraplang/scrapgrammar.hpp index 7a03ca1..62a4696 100644 --- a/src/scraplang/scrapgrammar.hpp +++ b/src/scraplang/scrapgrammar.hpp @@ -19,6 +19,33 @@ #pragma once #include +#include + +namespace kamokan { + template + struct IniCommentSkipper : boost::spirit::qi::grammar { + IniCommentSkipper() : + IniCommentSkipper::base_type(skipping), + first_char(true) + { + namespace px = boost::phoenix; + using boost::spirit::qi::blank; + using boost::spirit::qi::lit; + using boost::spirit::qi::eol; + using boost::spirit::qi::char_; + using boost::spirit::qi::eps; + + skipping = comment | blank; + comment = (eps(px::cref(first_char) == true) | eol) >> + *blank >> lit("#")[px::ref(first_char) = false] >> + *(!eol >> char_); + } + + boost::spirit::qi::rule skipping; + boost::spirit::qi::rule comment; + bool first_char; + }; +} //namespace kamokan namespace duck::sl { namespace qi = ::boost::spirit::qi;