/**
* @author Merijn de Jonge (mdjonge@cwi.nl)
*/
module stratego/gpp/Instantiate
rules
gpp-instantiate =
?(template, args)
; <gpp-instantiate(|args)> template
gpp-instantiate(|args) =
bottomup(
try(
?Arg(_); gpp-Instantiate(|args)
+ ?Arg2(_, _); gpp-Instantiate(|args)
+ ?[_|_]; gpp-flat-list
)
)
gpp-Instantiate(|args) =
gpp-FastInstantiate(|args) <+ gpp-SlowInstantiate(|args)
gpp-FastInstantiate(|args) :
Arg(1) -> a
where
!args => [a | _]
gpp-FastInstantiate(|args) :
Arg(2) -> a
where
!args => [_, a | _]
gpp-FastInstantiate(|args) :
Arg(3) -> a
where
!args => [_, _, a | _]
gpp-SlowInstantiate(|args) :
Arg(n) -> <index(|n)> args
gpp-SlowInstantiate(|args) :
Arg2(n, m) -> <index(|m)> list
where
<index(|n)> args => list
strategies
gpp-instantiate-list(|pp-entry) =
rec rec(
{sym,xs:
[]
<+ ?[sym|xs]
; [<gpp-instantiate(|[sym])> pp-entry | <rec> xs ]
}
)
gpp-instantiate-sep-list(|pp-entry) =
rec rec(
{sym,sep,xs:
[]
<+ ?[_]
<+ ?[sym, sep | xs]
; [<gpp-instantiate(|[sym, sep])> pp-entry | <rec> xs ]
}
)