Implement unusual syntax rules in grammar
Moritz Lenz
moritz at faui2k3.org
Sun Aug 9 09:49:36 UTC 2009
Hi,
Igor V. Burago wrote:
> Dear members of the list,
>
> I'm implementing language for science computations similar to Matlab. I found Parrot to be the best
> solution for that. Syntax of Matlab (which I'm trying to be compatible to) isn't quite logical and
> consistent, so I've faced some problems expressing it grammar in Perl 6 rules.
I don't know how octave implements its parser, but it might be worth
looking at it for prior art.
> 1. The language's control structures ('if', 'while', etc.) always ends with keyword 'end'. It's
> prohibited to use this reserved word for other purposes... except indexing!
...
> In other cases, such as usual expressions, I could deny using of 'end' identifier later in NQP.
> I don't think this is a sane solution of my problem (I also understand that this using of
> keyword is not quite sane too). Is there a better way? Please let me know.
I don't understand why you can't do it always that way
rule if_statement {
:dba('if statement')
'if' <condition> ~ 'end'
<block>
}
...
token identifier {
<[a..z A..Z]> \w* {*}
}
...
method identifier($/) {
if !$IN_ARRAY_INDEX && $/ eq 'end' {
die('Illegal usage of "end" outside array index');
}
...
}
and have the action method for the array index parsing set $IN_ARRAY_INDEX
> 2. Due to Matlab compatibility the language also has inconsistent use of whitespace. In most cases
> whitespace is not important and can be easily ignored by <ws> rule. But there is an exception
> --- array constructor where it's used as delimiter between elements.
>
> For example,
> [ 1 2 3 ] three elements
> [ 1 -2 3 ] still three elements
> [ 1-2 3 ] two elements
> [ 1- 2 ] one element
> [ 1 - 2 ] again, one element
>
> How whitespace matching behavior can be changed (for example, switched from one meaning to
> another inside and outside of expressions in array constructor) to parse such a weird
> constructions?
I don't know; maybe you can try to use only explicit whitespace matching
inside array constructors? Or use a different grammar with a different
we token for that?
Cheers,
Moritz
More information about the parrot-dev
mailing list