/**
* Implosion of lexical syntax.
*/
module stratego/asfix/implode/lexical
strategies
ImplodeLexical =
?appl(prod([lex(_)],cf(_),_), _)
; asfix-yield-appl
ImplodeLexical =
?appl(prod(_,lex(_),_), _)
; asfix-yield-appl
ImplodeLexical =
?appl(prod(_,lit(_),_),_)
; asfix-yield-appl
ImplodeLexical =
?appl(prod(_,cilit(_),_),_)
; asfix-yield-appl
ImplodeLexical =
ImplodeLexicalListVar <+ ImplodeLexicalVar
ImplodeLexicalListVar =
?appl(prod(_,varsym(cf(iter-star(_))),_),_)
; !meta-listvar(<asfix-yield-appl>)
ImplodeLexicalListVar =
?appl(prod(_,varsym(cf(iter-star-sep(_,_))),_),_)
; !meta-listvar(<asfix-yield-appl>)
ImplodeLexicalListVar =
?appl(prod(_,varsym(cf(iter(_))),_),_)
; !meta-listvar(<asfix-yield-appl>)
ImplodeLexicalListVar =
?appl(prod(_,varsym(cf(iter-sep(_,_))),_),_)
; !meta-listvar(<asfix-yield-appl>)
ImplodeLexicalVar =
?appl(prod(_,varsym(_),_),_)
; !meta-var(<asfix-yield-appl>)
strategies
/**
* The yield of an AsFixTerm is the string consisting of the
* characters at the leaves of the tree.
*/
asfix-yield-appl =
let yield(|chars) =
asfix-yield-acc(yield | chars)
in ?appl(_, <id>){anno*}
; yield(|[])
; implode-string
; ?s
; !s{anno*}
end
asfix-yield-acc(rec : b * c -> d | acc) :
appl(_, ts) -> acc'
where
acc' := <rec(|acc)> ts
asfix-yield-acc(rec : b * c -> d |acc) :
[] -> acc
asfix-yield-acc(rec : b * c -> d | acc) :
[x | xs] -> acc''
where
acc' := <rec(|acc)> xs
; acc'' := <rec(|acc')> x
asfix-yield-acc(rec : b * c -> d | acc) :
i -> [i | acc]
where
is-int