ometa Mbrella <: Parser { fromTo :x :y = seq(x) (~seq(y) char)* seq(y), space = super(#space) | fromTo('//', '\n') | fromTo('/*', '*/'), escapeChar = '\\' char:c -> unescape('\\' + c), str = '\'' (escapeChar | ~'\'' char)*:cs '\'' -> cs.join('') | '"' (escapeChar | ~'"' char)*:cs '"' -> cs.join(''), name = letterOrDigit+:cs -> cs.join(''), let = name:n "=" expr:e -> [`let, n, e], args = listOf(`name, ","), lets = (`let:l "," spaces -> l)*, template = "template" "(" args:as ")" "{" lets:ls expr:e "}" -> [`template, as, ls, e], function = "function" foreign(JSParser, "funcRest"):f -> [`function, f], state = "state" "(" foreign(JSParser, "expr"):j ")" -> [`state, j], action = "action" foreign(JSParser, "funcRest"):f -> [`action, f], node = element | text, element = "<" name:n attributes:as "/>" -> [`element, n, as, []] | "<" name:n attributes:as ">" node*:ns "" ?(n==n2) -> [`element, n, as, ns], text = (~"<" ~"{" char)+:cs -> [`text, [`strvalue, cs.join('')]] | insert:i -> [`text, i], attribute = name:n spaces "=" spaces value:v -> [`att, n, v], attributes = (spaces attribute)*, value = insert | strvalue, insert = "{" foreign(JSParser, "expr"):e "}" -> [`insert, e], strvalue = str:s -> [`strvalue, s] } Mbrella.matchAll('ioi', "element")