#!/usr/bin/env node var util = require("util"); var fs = require("fs"); var PEG = require("../lib/peg"); /* Helpers */ function printVersion() { util.puts("PEG.js " + PEG.VERSION); } function printHelp() { util.puts("Usage: pegjs [options] [--] [] []"); util.puts(""); util.puts("Generates a parser from the PEG grammar specified in the and"); util.puts("writes it to the ."); util.puts(""); util.puts("If the is omitted, its name is generated by changing the"); util.puts(" extension to \".js\". If both and are"); util.puts("omitted, standard input and output are used."); util.puts(""); util.puts("Options:"); util.puts(" -e, --export-var name of the variable where the parser object"); util.puts(" will be stored (default: \"module.exports\")"); util.puts(" --cache make generated parser cache results"); util.puts(" --track-line-and-column make generated parser track line and column"); util.puts(" -v, --version print version information and exit"); util.puts(" -h, --help print help and exit"); } function exitSuccess() { process.exit(0); } function exitFailure() { process.exit(1); } function abort(message) { util.error(message); exitFailure(); } /* Arguments */ var args = process.argv.slice(2); // Trim "node" and the script path. function isOption(arg) { return /^-/.test(arg); } function nextArg() { args.shift(); } /* Files */ function readStream(inputStream, callback) { var input = ""; inputStream.on("data", function(data) { input += data; }); inputStream.on("end", function() { callback(input); }); } /* Main */ /* This makes the generated parser a CommonJS module by default. */ var exportVar = "module.exports"; var options = { cache: false, trackLineAndColumn: false }; while (args.length > 0 && isOption(args[0])) { switch (args[0]) { case "-e": case "--export-var": nextArg(); if (args.length === 0) { abort("Missing parameter of the -e/--export-var option."); } exportVar = args[0]; break; case "--cache": options.cache = true; break; case "--track-line-and-column": options.trackLineAndColumn = true; break; case "-v": case "--version": printVersion(); exitSuccess(); break; case "-h": case "--help": printHelp(); exitSuccess(); break; case "--": nextArg(); break; default: abort("Unknown option: " + args[0] + "."); } nextArg(); } switch (args.length) { case 0: process.stdin.resume(); var inputStream = process.stdin; var outputStream = process.stdout; break; case 1: case 2: var inputFile = args[0]; var inputStream = fs.createReadStream(inputFile); inputStream.on("error", function() { abort("Can't read from file \"" + inputFile + "\"."); }); var outputFile = args.length == 1 ? args[0].replace(/\.[^.]*$/, ".js") : args[1]; var outputStream = fs.createWriteStream(outputFile); outputStream.on("error", function() { abort("Can't write to file \"" + outputFile + "\"."); }); break; default: abort("Too many arguments."); } readStream(inputStream, function(input) { try { var parser = PEG.buildParser(input, options); } catch (e) { if (e.line !== undefined && e.column !== undefined) { abort(e.line + ":" + e.column + ": " + e.message); } else { abort(e.message); } } outputStream.write(exportVar + " = " + parser.toSource() + ";\n"); if (outputStream !== process.stdout) { outputStream.end(); } });