From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Writing a scanner and parser in Ada
Date: Tue, 26 Dec 2017 23:20:03 +0100
Date: 2017-12-26T23:20:03+01:00 [thread overview]
Message-ID: <p1uhui$1qd7$1@gioia.aioe.org> (raw)
In-Reply-To: aa4de6f2-1bda-4e72-be0d-c4aac324fd3b@googlegroups.com
On 2017-12-26 19:06, Shark8 wrote:
> Let's consider a simple example. We want to write a pattern to test
> for a list. We'll define a list as being one or more numbers
> separated by comma, and enclosed by parentheses. Use CODE.SNO to try
> this definition:
> ? ITEM = SPAN('0123456789')
> ? LIST = POS(0) '(' ITEM ARBNO(',' ITEM) ')' RPOS(0)
> ? '(12,345,6)' LIST
> Success
> ? '(12,,34)' LIST
> Failure
>
> ARBNO is retried and extended until its subsequent, ')', finally
> matches. POS(0) and RPOS(0) force the pattern to be applied to the
> entire subject string.
I forgot to show the pattern in my syntax:
'(' digit $digit $(',' digit $digit) ')' END
digit matches '0'..'9'. '$' is an eager repeater similar to 'ARBNO', so
$digit is a sequence of digits, maybe empty. digit $digit is a sequence
of at least one digit. END matches line end. Matching is always
anchored, using SNOBOL terms.
BTW, one could consider adding a 'FENCE' or two to prevent backtracking
because, and this is the reason why the pattern is that simple, the
matching could never give back anything it already matched.
It is a kind of problem if you have patterns successfully matching empty
strings that are put under a repeater. You may run into an infinite loop
with backtracking.
As I said it is a toy example which is far easier and more importantly
*safer* to write in Ada. And the result will be more readable and far
more maintainable in the future.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2017-12-26 22:20 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-24 1:15 Writing a scanner and parser in Ada Yves Cloutier
2017-12-24 4:07 ` Robert Eachus
2017-12-25 16:32 ` Yves Cloutier
2017-12-24 9:08 ` Dmitry A. Kazakov
2017-12-24 15:09 ` Niklas Holsti
2017-12-25 16:37 ` Yves Cloutier
2017-12-25 16:35 ` Yves Cloutier
2017-12-25 17:08 ` Dmitry A. Kazakov
2017-12-25 18:57 ` Yves Cloutier
2017-12-25 19:19 ` Dmitry A. Kazakov
2017-12-26 18:06 ` Shark8
2017-12-26 21:45 ` Dmitry A. Kazakov
2017-12-26 22:20 ` Dmitry A. Kazakov [this message]
2017-12-24 14:40 ` Tero Koskinen
2017-12-25 16:36 ` Yves Cloutier
2017-12-24 15:33 ` Lucretia
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox