comp.lang.ada
 help / color / mirror / Atom feed
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

  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