Re: Boost Spirit and VS2017
Michael Powell <[email protected]> Wed, 31 Oct 2018 10:02:47 -0400
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <CAMEoF_FVjmcmSizNfvoOh+fe81N1TnH6NVOv8KU3VngSim9jMw@mail.gmail.com> |
On Wed, Oct 31, 2018 at 9:48 AM Michael Powell <[email protected]> wrote: > > On Tue, Oct 30, 2018 at 6:57 PM Michael Powell <[email protected]> wrote: > > > > Hello, > > > > I am receiving the following error building against the latest VS2017 ... > > > > 1>Version_Parser.cpp > > 1>d:\dev\boost.org\boost_1_68_0\boost\iostreams\positioning.hpp(96): > > error C4996: 'std::fpos<_Mbstatet>::seekpos': warning STL4019: The > > member std::fpos::seekpos() is non-Standard, and is preserved only for > > compatibility with workarounds for old versions of Visual C++. It will > > be removed in a future release, and in this release always returns 0. > > Please use standards-conforming mechanisms to manipulate fpos, such as > > conversions to and from streamoff, or an integral type, instead. If > > you are receiving this message while compiling Boost.IOStreams, a fix > > has been submitted upstream to make Boost use standards-conforming > > mechanisms, as it does for other compilers. You can define > > _SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING to acknowledge that you have > > received this warning, or define _REMOVE_FPOS_SEEKPOS to remove > > std::fpos::seekpos entirely. > > 1>c:\program files (x86)\microsoft visual > > studio\2017\enterprise\vc\tools\msvc\14.15.26726\include\iosfwd(59): > > note: see declaration of 'std::fpos<_Mbstatet>::seekpos' > > I got past this issue. Thanks go to Gavin on the Boost list! Still > need to acknowledge with the definition however. > > > With my grammar: > > > > BOOST_FUSION_ADAPT_STRUCT(NS_VERSION_H::version, _major, _minor, > > _patch, _build); > > > > template <typename It> > > struct version_parser : qi::grammar<It, NS_VERSION_H::version()> { > > > > version_parser() : dot_('.'), version_parser::base_type(_start) { > > using qi::lit; > > using qi::hold; > > using qi::short_; > > _major_part = short_; > > _minor_part = lit(dot_) >> short_; > > _patch_part = lit(dot_) >> short_; > > _build_part = lit(dot_) >> short_; > > _start = hold[_major_part >> _minor_part >> -(_patch_part >> > > -_build_part)]; > > } > > > > private: > > > > qi::rule<It, NS_VERSION_H::version()> _start; > > const char dot_; > > qi::rule<It, short()> _major_part; > > qi::rule<It, short()> _minor_part; > > qi::rule<It, short()> _patch_part; > > qi::rule<It, short()> _build_part; > > }; > > > > bool try_parse_version(const std::string& s, NS_VERSION_H::version& v) { > > using It = std::string::const_iterator; > > using qi::parse; > > > > It first = s.begin(), last = s.end(); > > > > if (!parse(first, last, version_parser<It>{}, v)) { > > std::cout << "Failed to parse: '" << s << "'" << std::endl; > > return false; > > } > > > > const auto dot_ = "."; > > > > std::cout << "version: " > > << v._major > > << dot_ << v._minor > > << dot_ << v._patch > > << dot_ << v._build << std::endl; > > > > return true; > > } > > It seems to be parsing all but the last element. I think it's an EOI > issue? But memory escapes me at the moment how Spirit Qi handles that > use case... Something like this? > > using qi::lit; > using qi::no_skip; > using qi::short_; > using qi::eoi; > _major_part = short_; > _minor_part = lit(dot_) >> short_; > _patch_part = lit(dot_) >> short_; > _build_part = lit(dot_) >> short_; > _start = no_skip[_major_part >> _minor_part >> (_patch_part | > (_patch_part >> _build_part))] >> eoi; I decided to go the no_skip[short_ % dot_] route. Not a perfect representation of a version string, without additional help in response, that is, but it'll suffice. > Cheers! > > > At present I have not furnished any Spirit flags or anything of that > > sort; pretty much taking the includes, grammar, building as-is. > > > > Secondary to the error, I want the parser to reject spaces, should > > just be numeric (short) and the dot delimiter. > > > > Best regards, > > > > Michael Powell