A new release of MEPS is available on SqueakMap. MEPS is a parser combinator for squeak that allows parsers to be combined and evaluated through a set of matching extension methods in PositionableStreams eg:
'foobar' readStream match: 'foo' and: 'bar' regex action:[:r | FooBarNode foo:r first bar: r second ].
where 'foo' and ('bar' regex) are parsers defined on the fly. This release provides additional ways to combine parsers separate from their invocation.
The following example creates a parser of a Smalltalk method temp declaration:
whitespace := '\s*' regex. id := '\a\w*' regex. ids := (whitespace , id ! [ : r | r second]) zeroOrMore . temps := '|' meps , ids , whitespace , '|' ! [:list | list second]. temps << '| foo bar |' "anOrderedCollection('foo' 'bar')"
(This example is somewhat contrived because in a real Smalltalk parser, tokenizing and parsing would occur in separate phases (each of which could be created using MEPS)).
In ids, a whitespace parser is combined (#,) with an identifier parser. Then #! yields a parser with an action that transforms {ws,id} to id, which is then used in a repetition parser created by #zeroOrMore.
temps << | foo bar |' is equivalent to '| foo bar |' readStream match:temps action:[:r|r].
ids could have been written equivalently as: ids := [:input | input matchZeroOrMore: [:in2 | in2 match: whitespace and: id action: [ : r | r second]] action:[:r |r ]].
(Note: in this release, block parsers no longer have to capture the input stream).
See http://squeak.reider.net/MEPS/meps.html for more examples.
squeak-dev@lists.squeakfoundation.org