ometa ServerURIParser{ word = (letter|``-'')+:l -> l.join(''), dgit = ^digit:d -> d.digitValue(), nmbr = nmbr:n dgit:d -> (n * 10 + d) | dgit, part = (letter|digit|``-''|``_'')+:l -> l.join(''), mdtp = ``filt'' | ``sort'', parm = part:t (``.'' word| -> {f=t;t=[];f}):f (``='' ->`eq |``!=''->`ne|``~'' ->`lk):o part:v ``;''? -> [o,t,f,v], actn = (``*'' mdtp:a (``:'' parm+|->[]):p -> [a].concat(p))+ | -> [], comm = ``cr'' | ``execute'', term = (letter|``_'')+:l -> l.join(''), verb = (letter|``_'')+:l -> l.join(''), trmf = term:t -> [`term, t], fcTp = {ts=[`terms];ft=''} (term:t ``-'' verb:v -> {ts.push(t);ft += t + "-" + v})+ (``-'' term:t -> {ts.push(t);ft += "-" + t})? -> [`fcTp, ft, ts], id = (``.'' nmbr:n -> [n]|->['']), uri = ``/'' word:w ``/''? fcTp:f id:i actn:a ``/'' comm:c -> [w].concat([f.concat(i).concat([[`mod].concat(a).concat([[c]])])]) | ``/'' word:w ``/''? trmf:t id:i actn:a ``/'' comm:c -> [w].concat([t.concat(i).concat([[`mod].concat(a).concat([[c]])])]) | ``/'' word:w ``/''? fcTp:f id:i actn:a ``/''? -> [w].concat([f.concat(i).concat([[`mod].concat(a)])]) | ``/'' word:w ``/''? trmf:t id:i actn:a ``/''? -> [w].concat([t.concat(i).concat([[`mod].concat(a)])]) | ``/'' (word|->''):w ``/''? -> [w] } uri1 = "/data/pilot" uri1a = "/data/pilot*filt:a=b;c=d*filt:e=f" uri2 = "/data/pilot-can_fly-plane" uri3 = "/data/pilot-can_fly-plane*filt:a=b;c=d" uri4 = "/data/pilot-can_fly-plane*filt:a=b;c=d*filt:e=f" uri5 = "/data" uri6 = "/" uri7 = "/ui/textarea.model-area/" uri8 = "/data/pilot-can_fly-plane*filt:a=b;c=d*filt:e=f/" uri9 = "/ui/textarea*filt:name=model_area/" uriA = "/ui/textarea-is_disabled*filt:textarea.name=model_area/" uriB = "/data/pilot" uriC = "/data/pilot-can_fly-plane.14" uriD = "/data/lock*filt:lock.id=14/execute" uriE = "/ui/textarea*filt:name=model_area/" ServerURIParser.matchAll(uri2, 'uri')