amethyst Amethyst < AmethystCore { eof= ~. empty = -> nil char= .:c &{c.is_a? String } -> c newline = '\r\n' | '\r' | '\n' line = (newline break | .)*:{it*""} space = <\s\t\r\n\f> spaces= space* _ = space lower=<a-z> upper=<A-Z> alpha = lower|upper alnum = alpha|digit digit=<0-9> xdigit = <0-9a-fA-F> word = alpha | '_' int = ('-'|{""}):m ('0x' <0-9a-fA-F>+ | '0b' <01>+ | '0o' <0-7>+ | <0-9>+)[]:n {(m+n*"").to_i} number = int until(e) = ( seq(e) break | ('\\':[x])? .:[x] )* -> x.join listOf(rule,delim) = apply(rule):[f] (seq(delim) apply(rule))*:[f] -> f | empty -> [] find(exp) = (apply(exp):e break | .)* .* -> e replace(exp) = (apply(exp) | .)*:{it*""} fails = &{false} token(s) = spaces seq(s) seq(s) = _seq(s) {s} member(x) = .:a &{x === a} {a} true = member(true) false = member(false) nil = member(nil) clas(cls) = member(cls) range_in(a,b) = member(a.. b) range_ex(a,b) = member(a...b) regch(regex) = member(regex) reverse(l) = {@@rev||=Hash.new{|h,k| h[k]=k.reverse }} _reverse(@@rev[@self]) apply(l):rev _reverse(@@rev[@self]) {rev} #TODO array reversal likewise parse(rule,obj,args) = {obj}[ {apply(rule,*args)}:r {self.profile_report;r}] nested(start,mid,end) = seq(start) apply(mid) seq(end) }