diff --git a/bin/jison b/bin/jison index 54d77affe..9ababc7bc 100755 --- a/bin/jison +++ b/bin/jison @@ -1,3 +1,3 @@ #!/usr/bin/env narwhal -require('jison').main(system.args); +require('jison/cli-wrapper').main(system.args); diff --git a/lib/jison.js b/lib/jison.js index bba2f4dfc..152b5f5cc 100644 --- a/lib/jison.js +++ b/lib/jison.js @@ -1488,43 +1488,3 @@ return function Parser (g, options) { })(); -exports.main = function main (args) { - //var parser = new require("args").Parser(); - var fs = require("file"); - gfile = fs.path(fs.cwd()).join(args[1]); - - // try to parse as JSON, else use BNF parser - if (gfile.extension() === '.json') { - var grammar = JSON.parse(gfile.read({charset: "utf-8"})); - } else if (gfile.extension() === '.jison') { - var grammar = require("jison/bnf").parse(gfile.read({charset: "utf-8"})); - } - - var opt = grammar.options || {}; - - // lexer file - if (args[2]) { - var lfile = fs.path(fs.cwd()).join(args[2]); - - // try to parse as JSON, else use BNF parser - if (lfile.extension() === '.json') { - grammar.lex = JSON.parse(lfile.read({charset: "utf-8"})); - } else if (lfile.extension() === '.jisonlex') { - grammar.lex = require("jison/jisonlex").parse(lfile.read({charset: "utf-8"})); - } - } - - if (!opt.moduleName) - opt.moduleName = gfile.basename().replace(new RegExp(gfile.extension()+"$"), ""); - if (!opt.moduleType) - opt.moduleType = "commonjs"; - - var generator = new Jison.Generator(grammar, opt); - fname = fs.path(fs.cwd()).join(opt.moduleName + ".js"), - source = generator.generate(opt), - stream = fname.open("w"); - - stream.print(source); - stream.close(); -}; - diff --git a/lib/jison/cli-wrapper.js b/lib/jison/cli-wrapper.js new file mode 100644 index 000000000..28a8481b6 --- /dev/null +++ b/lib/jison/cli-wrapper.js @@ -0,0 +1,34 @@ +var JISON = require('../jison'); + IO = require('./util/io'); + +exports.main = function (argv) { + var args = argv.slice(1); + + if (args.length) { + var raw = IO.read(IO.join(IO.cwd(),args[0])), + name = IO.basename(args[0]).replace(/\..*$/g,''), + lex; + if (args[1]) { + lex = IO.read(IO.join(IO.cwd(),args[1])); + } + IO.write(name+'.js', processGrammar(raw, lex, name)); + } else { + IO.stdin(function (raw) { + IO.stdout(processGrammar(raw)); + }); + } +} + +function processGrammar (rawGrammar, lex, name) { + var grammar = require("./bnf").parse(rawGrammar); + var opt = grammar.options || {}; + if (lex) grammar.lex = require("./jisonlex").parse(lex); + if (!opt.moduleType) opt.moduleType = "commonjs"; + if (!opt.moduleName && name) opt.moduleName = name; + + var generator = new JISON.Generator(grammar, opt); + return generator.generate(opt); +} + +if (require.main === module) + exports.main(IO.args) diff --git a/lib/jison/util/io.js b/lib/jison/util/io.js new file mode 100644 index 000000000..a725d3f33 --- /dev/null +++ b/lib/jison/util/io.js @@ -0,0 +1,67 @@ + +// node +if (typeof process !== 'undefined') { + +var fs = require('fs'); +var sys = require('sys'); + +exports.p = sys.puts; +exports.cwd = process.cwd; +exports.join = require('path').join; +exports.basename = require('path').basename; +exports.args = process.argv.slice(1); + +exports.read = function (fname) { + return fs.readFileSync(fname, "utf8"); +} + +exports.write = function (fname, data) { + fs.writeFileSync(fname, data); +} + +exports.stdin = function (cb) { + var stdin = process.openStdin(), + data = ''; + + stdin.setEncoding('utf8'); + stdin.addListener('data', function (chunk) { + data += chunk; + }); + stdin.addListener('end', function () { + cb(data); + }); +} + +exports.stdout = function (out) { + process.stdout.write(out); +} + +// commonjs/narwhal-like +} else { + +var fs = require('file'); +var system = require('system'); + +exports.p = print; +exports.cwd = fs.cwd; +exports.join = fs.join; +exports.basename = fs.basename; +exports.args = system.args.slice(0); + +exports.read = function (fname) { + return fs.read(fname); +} + +exports.write = function (fname, data) { + fs.write(fname, data); +} + +exports.stdin = function (cb) { + cb(system.stdin.read()); +} + +exports.stdout = function (out) { + system.stdout.print(out); +} + +}