James Kanze
11/17/2008 9:39:00 AM
On Nov 16, 11:09 pm, gw7...@aol.com wrote:
> On 16 Nov, 21:42, Erik Wikström <Erik-wikst...@telia.com> wrote:
> > On 2008-11-16 22:16, gw7...@aol.com wrote:
> > > I have a program that needs to do a small amount of
> > > relatively simple parsing. The routines I've written work
> > > fine, but the code using them is a bit long-winded.
> > > I therefore had the idea of creating a class to do
> > > parsing. It could be used as follows:
> > > int a, n, x, y;
> > > Parser par;
> > > par << string;
> > > if (par >> "From" >> ' ' >> x >> ' ' >> "to" >> ' ' >> y) a = 1;
> > > else if (par >> "Number" >> ' ' >> n) a = 2;
> > > else a = 3;
> > > Then if string is "From 3 to 5" this will set a=1, x=3,
> > > y=5. If the string is "Number 2" this will set a=2 and
> > > n=2. If string is "Other" then a=3. For convenience, I'll
> > > assume that an input of "From 4 other" is allowed to alter
> > > the value of x while returning a=3.
> > > I think I could write a class that would do this. It would
> > > need to keep track of whether the current parsing was
> > > succeeding and, if so, how far through the string it had
> > > got. It would need overloaded >> operators, obviously,
> > > some of them taking references. And it would need a
> > > conversion operator, which I think would need to be to
> > > void *, which would not only return whether the current
> > > parse had succeeded but would also reset the flag and
> > > counter ready for another attempt.
> > > So my questions are, is this a sensible thing to try to
> > > do, and are there any potential snags that I haven't
> > > spotted?
> > If you need to parse a lot you should probably try a tool
> > like yacc or some other parser-generator. If you only need
> > to be able to parse a very small grammar (and want a good
> > exercise) you can try to write the state- machine by hand.
> I don't think I'm going to be doing that much parsing, though
> I'll bear that in mind if i do.
> > You example looks like a runtime-construct (though, perhaps
> > you can make it compile-time with some fancy template
> > meta-programming) which does not sound like a good idea to
> > me.
> How my example works - par >> "text" will check to see whether
> the next bit of the string to be parsed contains the
> characters "text".
I think that that's what I really don't care for in it. One
expects >> to read, not to check.
What's wrong with just using boost::regex?
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34