ometa W { oneOf :a ?(a.length == 1) = apply(a.pop()), oneOf :a ?(a.length > 1) = apply(a.pop()) | oneOf(a), bla = oneOf([`b, `i]):c -> [`one, c], escapedChar = '~' char:c -> c, escaped = escapedChar+:c -> [`escaped, c.join('')], b = seq('**'), i = seq('//'), s = seq('--'), nl = '\n' ((~'\n' space)* '\n')+, special = (b | i | s | nl):c -> [`special, c], between :t :n = apply(t) (~oneOf(n) inline(W.add(n, t)))*:c apply(t) -> c, between_ :t = apply(t) (~special text)*:c (~~special | end) -> c, bold :n = between(`b, n):c -> [`bold, c], bold_ = between_(`b):c -> [`bold_, c], italic :n = between(`i, n):c -> [`italic, c], italic_ = between_(`i):c -> [`italic_, c], strike :n = between(`s, n):c -> [`strike, c], strike_ = between_(`s):c -> [`strike_, c], text = (~special ~escapedChar char)+:c -> c.join('') | escaped:c -> c, inline :n = bold([`b]) | italic([`i]) | strike([`s]) | text, inline :n ?(n.length > 0) = bold(n) | italic(n) | strike(n) | text, inline_ = bold_ | italic_ | strike_, allInline = inline([]) | (~inline([]) inline_), para = (~nl allInline)+:c (nl | end) -> [`para, c], allBlock = para, topLevel = (allInline)+ } W.without = function(arr, elem) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (arr[i] != elem) newArr[newArr.length] = arr[i]; } return newArr; } W.add = function(arr, elem) { for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] == elem) return arr; } arr[arr.length] = elem; return arr; } alert(W.matchAll('1ad', 'topLevel'));