ometa StreamParser <: Parser { sortingDef = [sortingExpr:exp] -> exp, sortingExpr = fieldName:fn "ascending" -> { 'function(a, b) { var v1 = a' + fn + ', v2 = b' + fn + '; return (v1 == v2 ? 0 : (v1 < v2 ? -1 : 1)) }' } | fieldName:fn "descending" -> { 'function(a, b) { var v1 = a' + fn + ', v2 = b' + fn + '; return (v1 == v2 ? 0 : (v1 > v2 ? -1 : 1)) }' }, filterDef = [filterExpr:exp] -> exp, filterExpr = fieldName:fn "starts with" spaces value:v -> { fn + '.startsWith("' + v + '")' } | fieldName:fn "ends with" spaces value:v -> { fn + '.endsWith("' + v + '")' } | fieldName:fn "contains" spaces value:v -> { fn + '.indexOf("' + v + '") > -1' } | fieldName:fn "is" spaces value:v -> { fn + ' == "' + v + '"' }, fieldName = namespaceId, value = strValue, /* basic string processing */ nameFirst = letter | '$' | '_', nameRest = nameFirst | digit, iName = firstAndRest(#nameFirst, #nameRest):r -> r.join(''), nsName = iName:n1 ':' iName:n2 -> { n1 + ':' + n2 }, name = iName:n -> n, // | nsName:n -> n, namespaceIdSplitted = name:n '.' namespaceIdSplitted:r -> { [n].concat(r) } | nsName:n -> { [n] } | name:n -> { [n] }, namespaceId = namespaceIdSplitted:nArr -> { '[\'' + nArr.join('\'][\'') + '\']'}, fromTo :x :y = seq(x) (~seq(y) char)*:cs seq(y) -> cs.join(''), word = (~space char)*:l -> l.join(''), strValue = ( fromTo('\'', '\'') | fromTo('"', '"') | word ):n -> n }