On 1/15/17 12:43 PM, Dicebot wrote:
On 01/15/2017 01:26 AM, Dmitry Olshansky wrote:
- versatility, generating some goofy parse tree is not a goal, the goal
is extraction of data the way the user specifies
Can you show an example of what you have in mind for this?
Each parser has a value type that it extracts from the stream. It can be
an AST node but doesn't have to. For instance, taking a page form the
auto expr = dynamic!int;
auto primary = any(
range!('0', '9').rep.map!(x => x.to!int),
seq(tk!'(', expr, tk!')').map!(x => x)
Here 'expr' is a parser that produces an int that will be defined later.
Then we see how digits are converted to string: 'range' has value of
parsed digit, rep tells to apply it repeatedly and use the slice of
input as the value. Finally map converts parser producing slice to
parser producing int.
Similarly the result of 'seq' is a tuple and map takes the middle one
('expr'), that produces an int.
I could have wasted time by creating nodes and assigning values in the
map functions but if you just want the result of calculation it's all moot.