[squeak-dev] Parse specified number of elements with OMeta

Yoshiki Ohshima Yoshiki.Ohshima at acm.org
Thu Dec 6 17:43:50 UTC 2012


On Thu, Dec 6, 2012 at 8:10 AM, Frank Shearar <frank.shearar at gmail.com> wrote:
> On 6 December 2012 06:15, Yoshiki Ohshima <Yoshiki.Ohshima at acm.org> wrote:
>> There may have been many similar attempts, but come to think of it,
>> adding a simple higher-order rule to OMeta that applies the given rule
>> for a given number of times is just straightforward.  For example, if
>> you want to only parse a string that represents fully padded
>> hexadecimal digits for a 8 or 4 byte quantity, you can write:
>>
>> hex16or8 =
>>   numberOf(#hex. 16)
>> | numberOf(#hex. 8)
>>
>> where #hex is something like:
>>
>> hex :c =
>>    ?[(c between $0 and: $9) or: [c between: $A and: $F]
>
> I think you're missing a trailing ] there.

Thanks.  I typed this in above, as my actual implementation was even
uglier and made a mistake.

>> The numberOf rule looks like:
>>
>> numberOf :rule :count =
>>     [0]:c [OrderedCollection new]:xs
>>     ([c+1]:c ?[c <= count] apply(rule):x [xs add: x])*
>>     ?[c = (count + 1)] -> [xs]
>
> I may be misremembering my OMeta grammar, but I thought you'd need
> some |s between those.

No.

> Or is it that [0] binds to :count (calling it
> c), which makes the initial collection.

The numberOf rule takes two arguments, the rule to be applied and how
many times.

[0]:c binds 0 to c. And as a separate semantic action, a new
OrderedCollection is bound to xs.

> Then we apply some number of
> times (the *) the rule that runs :rule,

Yes.

> and finally we have a semantic
> action returning the final collection?

Yes, only after checking that the above loop terminated on the
condition, not failing to match rule by ?[c = (count + 1)].

--
-- Yoshiki


More information about the Squeak-dev mailing list