module stratego/asfix/anno
imports libstratego-lib
/**
* Position information
*/
strategies
/**
* Annotates an AsFix parse tree with position information.
*/
asfix-anno-position-info(|path) =
?pt; prim("STRSGLR_anno_position_info", pt, path)
/**
* Comments
*/
strategies
asfix-anno-comments =
asfix-anno-comments(| ["Comment"] )
asfix-anno-comments(|s) =
{| get-comment-sorts :
rules( get-comment-sorts : _ -> s )
; asfix-anno-topdown-consnil(try(AnnoComment))
|}
AnnoComment :
[ a1@appl(prod([cf(layout)], cf(opt(layout())), _), args)
, a2
| as ]
->
[ a1, a2' | as ]
where
<fetch-comment> args => (comment,sort)
; <try(oncetd({p:
has-cons; ?p{a*}; !p{(Comment(sort), comment), a*}
}))> a2 => a2'
fetch-comment =
where(get-comment-sorts => sortnames)
; oncetd({sortname:
?appl(prod(_, lex(sort(sortname)), _), _)
; where(<fetch(?sortname)> sortnames => sort)
; asfix-anno-yield
; !(<id>,sortname) => s
})
; !s
has-cons =
where(
?appl(prod(_, _, <id>), _)
; oncetd(?cons(_))
)
strategies
asfix-anno-topdown-consnil(s) =
rec x(s; asfix-anno-all-consnil(x))
asfix-anno-all-consnil(s) =
if is-list then
[s | id]; [id | s] + []
else
all(s)
end
rules
asfix-anno-Kids : appl(p, ts) -> <concat> ts
asfix-anno-Kids' : x -> [x]
strategies
asfix-anno-yield =
rec x((appl(id, map(x)); asfix-anno-Kids) <+ asfix-anno-Kids')
; implode-string
signature
constructors
Comment : String -> AnnoKey