ometa ometa-parser <: ometa { nameFirst = letter | $_, nameRest = nameFirst | digit | $- | $!, tsName = nameFirst:f nameRest*:r -> <<`(_string ,f ,r)>>, name = wsnl* tsName, okeyword :xs = token(xs) ~letterOrDigit, characters = "''''", sCharacters = stringquote (~stringquote anything)*:xs stringquote -> <<'(_quoted_string ,xs)>>, osymbol = wsnl* "#" tsName:s -> << `(app exactly (symbol ,s))>>, char-literal = "$" anything:d -> << `(app exactly (character ,d)) >>, onumber = digit+:ds -> <<`(app exactly (_number ,ds))>>, letterOrDigit = letter | digit, args = "(" hostExpr:x ")" -> << x >>, application = name:rule args:as -> <<('app rule as)>> | name:rule1 -> <<('app rule1)>>, hostExpr = wsnl* (curlyHostExpr | atomicHostExpr), curlyHostExpr = wsnl* "<<" (~">>" anything)*:xs ">>" -> << `(act ,xs) >>, atomicHostExpr = (sCharacters | name):x -> <>, semAction = wsnl* ("!" | "->") wsnl* (atomicHostExpr:x -> <<('act x)>> | wsnl* curlyHostExpr:x -> <>), semPred = wsnl* "?" hostExpr:x -> <<('pred x)>>, expr = expr4:h (wsnl* "|" wsnl* expr4)*:t -> <<('or h t)>>, expr4 = (wsnl* expr3)*:xs -> << `(and ,xs)>>, optIter :x = "*" -> <<('many x)>> | "+" -> <<('many1 x)>> | empty -> <>, expr3 = expr2:x optIter(x):x ( ":" name:n -> << ('set n x) >> | empty -> << x >> ) | ":" name:n -> << ('set n ('loadarg)) >>, expr2 = wsnl* "~" expr2:x -> <<('not x)>> | wsnl* "&" expr1:x -> <<('lookahead x)>> | expr1, expr1 = application | semAction | semPred | wsnl* (characters | sCharacters:s -> <<`(app token ,s)>> | char-literal | osymbol | onumber) | wsnl* "(" wsnl* expr:x wsnl* ")" -> <>, rulearg = (":" name:argname wsnl* -> <>)* | empty, rule = name:n wsnl* rulearg:locals wsnl* "=" wsnl* expr:rhs -> << `(rule ,n ,locals ,rhs) >>, ws = $ | $ , wsnl = ws | cnewline, empty = -> <<'true>>, grammar = "ometa" ws+ name:n wsnl* ("<:" name | empty -> <<'OMeta>>):sn wsnl* "{" wsnl* rule:h wsnl* ("," wsnl* rule)*:t wsnl* "}" wsnl* -> << ('grammar n sn h t) >> }