Re: x3 grammar rules

Lane <[email protected]>
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <CAGchGNvzLpQS2i635QyDJTbfUCv1JM8PDd2OwS_-zLBp07etLQ@mail.gmail.com>
It's just text. I've changed the last line from '1 end' to be ...
        1 my_label

The rule to cover this is listed as ...

    x3::rule<class _group> const _group = "_group";
    auto const _group_def = int_ >> *(char_);
    BOOST_SPIRIT_DEFINE(_group);

On Thu, Jul 6, 2017 at 12:31 AM, Olaf Peter <[email protected]> wrote:
> [...]
>
>> Basically, I'd like to know if I'm going about the grammar correctly
>> as I'm trying to parse the entire file at once.
>>
>>      namespace client {
>>          // ...
>>
>>          // parse line of characters
>>          x3::rule<class _desc> const _desc = "_desc";
>>          auto const _desc_def = *(char_ - eol);
>>          BOOST_SPIRIT_DEFINE(_desc);
>>
>>          // parse 1 2 3
>>          x3::rule<class _number> const _number = "_number";
>>          auto const _number_def = int_ >> int_ >> int_;
>>          BOOST_SPIRIT_DEFINE(_number);
>>
>>          // parse 1 0.0 0.0 0.0
>>          x3::rule<class _point> const _point = "_point";
>>          auto const _point_def = int_ >> double_ >> double_ >> double_;
>>          BOOST_SPIRIT_DEFINE(_point);
>>
>>          // parse int chars int int int "1 tri 1 2 3"
>>          x3::rule<class _element> const _element = "_element";
>>          auto const _element_def = int_ >> *(char_) >> int_ >> int_ >>
>> int_;
>>          BOOST_SPIRIT_DEFINE(_element);
>>
>>          // parse int int int "4 5 6"
>>          x3::rule<class _elem_points> const _elem_points = "_elem_points";
>>          auto const _elem_points_def = int_ >> int_ >> int_;
>>          BOOST_SPIRIT_DEFINE(_elem_points);
>>
>>          x3::rule<class _group> const _group = "_group";
>>          auto const _group_def = int_ >> *(char_);
>>          BOOST_SPIRIT_DEFINE(_group);
>>
>>          auto description = skip(blank) [
>>              *(_desc >> eol)
>>          ];
>>
>>          auto numbers = skip(blank) [
>>              *(_number >> eol)
>>          ];
>>
>>          auto point = skip(blank) [
>>              *(_point >> eol)
>>          ];
>>
>>          // parse two lines instead of 2nd line which looks the same, but
>>          // has no element before it
>>          // 1 tri  1 2 3
>>          // 4 5 6
>>          auto element = skip(blank) [
>>              *(_element >> eol >> _elem_points >> eol)
>>          ];
>>
>>          auto group = skip(blank) [
>>              *(_group >> eol)
>>          ];
>>
>>          auto pr = [&] (auto& ctx) {
>>              std::cout << "hi " << std::endl;
>>              //cout << "desc = " << _attr(ctx) << endl;
>>          };
>>
>>          auto const input = description[pr]
>>              >> numbers[pr]
>>              >> point[pr]
>>              >> element[pr]
>>              >> group[pr];
>>          }
>>      }
>>
>>      int main() {
>>          // ...
>>
>>          mapped_file_source map(fil);
>>          istringstream iss(map.data());
>>          map.close();
>>
>>          boost::spirit::istream_iterator iter(iss >> noskipws), eof;
>>
>>          x3::parse(iter, eof,  client::input);
>>
>>          return (iter != eof);
>>      }
>>
>> And the file I'm trying to parse is formatted as follows, only much
>> larger.
>>
>>      my file description
>>      1 2 3
>>      1 0.0 0.0 0.0
>>      2 0.0 0.0 0.0
>>      3 0.0 0.0 0.0
>>      1 tri 1 3 1
>>      1 2 3
>>      2 tri 1 3 1
>>      4 5 6
>>      3 tri 1 3 1
>>      7 8 9
>>      1 end
>>
>> Here is the output of running this. I get a 'hi' for each rule, but I
>> don't get an error saying it didn't parse the entire file. Can anyone
>> offer some guidance.
>
>
> at the end of input file, is 'end' at the last line a keyword and your
> marker for EOL since I've not seen a rule for the keyword 'end'. This would
> explain the remainding iter != eof
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/spirit-general

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.