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