Hi Yary,

no, i haven't. I need to think about this. I have trouble seeing how this would solve my problem. As I indicated: the grammar itself does not change. It is only the methods that need to change. I don't think I could use the actions method to actually select an Actions class.

Thanks,
Theo

yary schreef op 2018-08-01 18:29:
Have you considered subclassing your grammar? The child inherits the
rules from the parent, and an override the changed methods. Or, the
parent grammar could be rules-and-common-methods-only, and then have
two child grammas for "inside parens" vs "outside parens."

Not sure the mechanics of implementing that.

-y

On Wed, Aug 1, 2018 at 7:41 AM, Theo van den Heuvel
<vdheu...@heuvelhlt.nl> wrote:

Hi Perl6-people,

I am looking for some inspiration. I am working with a grammar that
I would like to have operate in two different modes.
In both modes the rules are identical, but the methods should behave
differently. There are probably better ways to do this than I can
think of at this point.

As an illustration (not the actual problem), say we want to proces
arithmetical expressions in two modes: normally we just copy the
input, but within a pair of braces we directly calculate the result.
grammar actions are easy to write per mode, but the combination is
harder.

In our example we would like to convert "{3 + 5} + {2 -1}" into "8 +
1". In my original case the grammar is large.

So far, I have considered the following ideas:
- using a parameter on the grammar rules
- meddling with the AST
- using a dynamic variable (but actions are performed later)
- using the actions method (I don't see how I could use that here)

One way to get this done is by combining the first two ideas:

grammar Sum {
token TOP { ^ <Sum: 0> $ }
rule Sum($p) { <Expr>+ % <op> <flag>**{$p}}
rule Expr { <num> | '[' ~ ']' <Sum: 1> }
token op { <[-+]> }
token num { \d+ }
token flag { <?> }
}

The presence of the flag is the clue for the actions.

This is less than satisfactory because we would have to pass on the
parameter to all non-terminals.

Can anyone think of a better way to do this?

thanks,

--
Theo van den Heuvel

--
Theo van den Heuvel
Van den Heuvel HLT Consultancy

Reply via email to