On Thu, 31 Mar 2016 23:02:05 +0200
Daniel Hofmann
Suppose I want to parse a list of ";"-separated floating point pairs with "," being the pair separator as in "1,2;3,4". Following this list comes a string literal representing a file extension, such as ".txt".
Therefore what I want to successfully parse input like the following:
1,2;3,4.txt
(For the record, the input could also be 1.1,2.2;3.3,4.4.txt)
The parser I came up with is the 1:1 translation of above's description into the Spirit DSL and shows Spirit's expressive power:
((double_ % ",") % ";") >> ".txt"
Unfortunately, the parser fails on the input with the integral values above. Why? Because the fundamental parser for double_ greedily matches on the "4." in "4.txt". Changing the "4" to "4.0" as in
1,2;3,4.0.txt
parses successfully (but is not an option as it requires the user to always add a trailing ".0" in case the last digit is integral.
I read about Spirit's DSL mapping to Parsing Expression Grammar (PEG) with the choice operator | being evaluated in order. So the next logical step for me was to try making use of it and adapting the parser:
(((int_ | double_) % ",") % ";") >> ".txt"
which works on
1,2;3,4.txt
but no longer on
1,2;3,4.0.txt
Is there a way to adapt the parser to handle both cases?
I asked this on IRC and got the answer to try a solution based on
((double_ >> ".") | (int_ >> ".")) >> "txt"
but when I use use this to parse "4.txt" into a std::vector<double> via
parse(first, last, ((double_ >> ".") | (int_ >> ".")) >> "txt", into);
the vector contains: {4, 4} and its size() is 2, which I can make no sense of at all (but this may be a different problem).
That was me in IRC. I assumed you would be using `variant