// Written by Günther Noack // http://twitter.com/guenthr // ARGV parser. // Override the 'rest' rule for extension. ometa ArgvParser <: Parser { grammar = options:opts rest:r -> ['Options', opts, r], options = (longopt | shortopt)+:opts -> opts, value = char+:cs -> cs.join(''), soptval = [ value:v ] -> v | empty -> 'true', loptval = '=' value:v -> v | empty -> 'true', optname = letter+:cs -> cs.join(''), shortopt = [ '-' letter:k ] soptval:v -> [k, v], longopt = [ "--" optname:k loptval:v ] -> [k, v], rest = ~anything -> [] } parseArgs = function(argv) { return ArgvParser.matchAll(argv, 'grammar') } // I "strayed from the path". ;-) How do I write // proper unit tests in this JavaScript dialect? parseArgs(['-o']) // --> [Options, [[o, true]], []] parseArgs(['-e', 'foo']) // --> [Options, [[e, foo]], []] parseArgs(['--foo=bar']) // --> [Options, [[foo, bar]], []] parseArgs(['-o', '1', '--foo=bar']) // --> [Options, [[o, 1], [foo, bar]], []]