ometa multiword{ isKeyword :x = ?multiword._isKeyword(x), letters = letter+:l -> l.join(''), word = letters:w -> {kind: 'word', value: w}, scanner = space* word, token :k = scanner:t ?(t.kind==k) -> t.value, keyword = "word"+:k isKeyword(k.join(' ')) -> ['keyword', k.join(' ')], verb = ("word":k ~isKeyword(k) -> k)+:l -> ['verb', l.join(' ')], expr = keyword:k ',' verb:v ',' keyword:e -> [k, v, e] } multiword.keywords = {} keywords = ["one", "two or more"] for (var idx = 0; idx < keywords.length; idx++){multiword.keywords[keywords[idx]] = true} multiword._isKeyword = function(k) { return this.keywords.hasOwnProperty(k) } sentence = 'one, can have, two or more' multiword.matchAll(sentence, 'expr')