Toy XML parser ometa XMLParser { expr = (~'<' char)*:c -> c.join('') | '<' (~'>' char)+:c '>' expr*:b seq('' char)+:c '>' -> [c.join('') , b] } model = "zz" alert(XMLParser.matchAll(model, 'expr')) //converting XML trees to ASTs ometa XMLParser { inelement:x = seq(x) (~seq(x) char)*:c seq(x) -> [x , c.join('')], stuff = inelement(''):c -> c, expr = stuff:s } model = "bb" alert(XMLParser.matchAll(model, 'expr')) //parsing 2-level xml elements ometa XMLParser { otherstuff = seq('') (~seq('') char)*:c seq('') -> ['b' , c.join('')], stuff = seq('') (~seq('') otherstuff)*:c seq('') -> ['a' , c.join('')], expr = stuff:s -> s } model = "alalal/.alalal/." alert(XMLParser.matchAll(model, 'expr')) //parsing a single xml element ometa XMLParser { between :x :y = seq(x) (~seq(y) char)*:c seq(y) -> c.join(''), stuff = between('',''), expr = stuff:s -> s } model = "alalal/." alert(XMLParser.matchAll(model, 'expr'))