Switch command-line mode backend from Rhino to Node
parent
e25dcfbac8
commit
814ce7d9db
@ -1,10 +1,127 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/env node
|
||||||
|
|
||||||
if [ -L "$0" ]; then
|
var sys = require("sys");
|
||||||
THIS_FILE=`readlink "$0"`
|
var fs = require("fs");
|
||||||
else
|
var PEG = require("../lib/peg");
|
||||||
THIS_FILE=$0
|
|
||||||
fi
|
|
||||||
DIR=`dirname "$THIS_FILE"`
|
|
||||||
|
|
||||||
java -jar "$DIR/../vendor/rhino/js.jar" "$DIR/pegjs-main.js" "$DIR" "$@"
|
/* ===== Helpers ===== */
|
||||||
|
|
||||||
|
function printVersion() {
|
||||||
|
sys.puts("PEG.js " + PEG.VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
function printHelp() {
|
||||||
|
sys.puts("Usage: pegjs [options] [--] [<input_file>] [<output_file>]");
|
||||||
|
sys.puts("");
|
||||||
|
sys.puts("Generates a parser from the PEG grammar specified in the <input_file> and");
|
||||||
|
sys.puts("writes it to the <output_file>.");
|
||||||
|
sys.puts("");
|
||||||
|
sys.puts("If the <output_file> is omitted, its name is generated by changing the");
|
||||||
|
sys.puts("<input_file> extension to \".js\". If both <input_file> and <output_file> are");
|
||||||
|
sys.puts("omitted, standard input and output are used.");
|
||||||
|
sys.puts("");
|
||||||
|
sys.puts("Options:");
|
||||||
|
sys.puts(" -e, --export-var <variable> name of the variable where the parser object");
|
||||||
|
sys.puts(" will be stored (default: \"exports.parser\")");
|
||||||
|
sys.puts(" -v, --version print version information and exit");
|
||||||
|
sys.puts(" -h, --help print help and exit");
|
||||||
|
}
|
||||||
|
|
||||||
|
function exitSuccess() {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function exitFailure() {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function abort(message) {
|
||||||
|
sys.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 = "exports.parser";
|
||||||
|
|
||||||
|
while (args.length > 0 && isOption(args[0])) {
|
||||||
|
switch (args[0]) {
|
||||||
|
case "-e":
|
||||||
|
case "--export-var":
|
||||||
|
nextArg();
|
||||||
|
exportVar = args[0];
|
||||||
|
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:
|
||||||
|
var inputStream = process.openStdin();
|
||||||
|
var outputStream = process.stdout;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
var inputStream = fs.createReadStream(args[0]);
|
||||||
|
var outputStream = fs.createWriteStream(
|
||||||
|
args.length == 1 ? args[0].replace(/\.[^.]*$/, ".js") : args[1]
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort("Too many arguments.");
|
||||||
|
}
|
||||||
|
|
||||||
|
readStream(inputStream, function(input) {
|
||||||
|
try {
|
||||||
|
var parser = PEG.buildParser(input);
|
||||||
|
} 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");
|
||||||
|
outputStream.end();
|
||||||
|
});
|
||||||
|
@ -1,155 +0,0 @@
|
|||||||
importPackage(java.io);
|
|
||||||
importPackage(java.lang);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Rhino does not have __FILE__ or anything similar so we have to pass the
|
|
||||||
* script path from the outside.
|
|
||||||
*/
|
|
||||||
load(arguments[0] + "/../lib/peg.js");
|
|
||||||
|
|
||||||
var FILE_STDIN = "-";
|
|
||||||
var FILE_STDOUT = "-";
|
|
||||||
|
|
||||||
function readFile(file) {
|
|
||||||
var f = new BufferedReader(new InputStreamReader(
|
|
||||||
file === FILE_STDIN ? System["in"] : new FileInputStream(file)
|
|
||||||
));
|
|
||||||
|
|
||||||
var result = "";
|
|
||||||
var line = "";
|
|
||||||
try {
|
|
||||||
while ((line = f.readLine()) !== null) {
|
|
||||||
result += line + "\n";
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function writeFile(file, text) {
|
|
||||||
var f = new BufferedWriter(new OutputStreamWriter(
|
|
||||||
file === FILE_STDOUT ? System.out : new FileOutputStream(file)
|
|
||||||
));
|
|
||||||
|
|
||||||
try {
|
|
||||||
f.write(text);
|
|
||||||
} finally {
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isOption(arg) {
|
|
||||||
return /-.+/.test(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
function printVersion() {
|
|
||||||
print("PEG.js " + PEG.VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
function printHelp() {
|
|
||||||
print("Usage: pegjs [options] [--] [<input_file>] [<output_file>]");
|
|
||||||
print("");
|
|
||||||
print("Generates a parser from the PEG grammar specified in the <input_file> and");
|
|
||||||
print("writes it to the <output_file>.");
|
|
||||||
print("");
|
|
||||||
print("If the <output_file> is omitted, its name is generated by changing the");
|
|
||||||
print("<input_file> extension to \".js\". If both <input_file> and <output_file> are");
|
|
||||||
print("omitted, standard input and output are used.");
|
|
||||||
print("");
|
|
||||||
print("Options:");
|
|
||||||
print(" -e, --export-var <variable> name of the variable where the parser object");
|
|
||||||
print(" will be stored (default: \"exports.parser\")");
|
|
||||||
print(" -v, --version print version information and exit");
|
|
||||||
print(" -h, --help print help and exit");
|
|
||||||
}
|
|
||||||
|
|
||||||
function nextArg() {
|
|
||||||
args.shift();
|
|
||||||
}
|
|
||||||
|
|
||||||
function exitSuccess() {
|
|
||||||
quit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function exitFailure() {
|
|
||||||
quit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function abort(message) {
|
|
||||||
System.out.println(message);
|
|
||||||
exitFailure();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This makes the generated parser a CommonJS module by default. */
|
|
||||||
var exportVar = "exports.parser";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The trimmed first argument is the script path -- see the beginning of this
|
|
||||||
* file.
|
|
||||||
*/
|
|
||||||
var args = Array.prototype.slice.call(arguments, 1);
|
|
||||||
|
|
||||||
while (args.length > 0 && isOption(args[0])) {
|
|
||||||
switch (args[0]) {
|
|
||||||
case "-e":
|
|
||||||
case "--export-var":
|
|
||||||
nextArg();
|
|
||||||
exportVar = args[0];
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "--version":
|
|
||||||
printVersion();
|
|
||||||
exitSuccess();
|
|
||||||
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:
|
|
||||||
var inputFile = FILE_STDIN;
|
|
||||||
var outputFile = FILE_STDOUT;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
var inputFile = args[0];
|
|
||||||
var outputFile = args[0].replace(/\.[^.]*$/, ".js");
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
var inputFile = args[0];
|
|
||||||
var outputFile = args[1];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
abort("Too many arguments.");
|
|
||||||
}
|
|
||||||
|
|
||||||
var input = readFile(inputFile);
|
|
||||||
try {
|
|
||||||
var parser = PEG.buildParser(input);
|
|
||||||
} catch (e) {
|
|
||||||
if (e.line !== undefined && e.column !== undefined) {
|
|
||||||
abort(e.line + ":" + e.column + ": " + e.message);
|
|
||||||
} else {
|
|
||||||
abort(e.message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
writeFile(outputFile, exportVar + " = " + parser.toSource() + ";\n");
|
|
@ -1,6 +0,0 @@
|
|||||||
@echo off
|
|
||||||
|
|
||||||
set DIR_WITH_SLASH=%~dp0
|
|
||||||
set DIR=%DIR_WITH_SLASH:~0,-1%
|
|
||||||
|
|
||||||
java -jar "%DIR%\..\vendor\rhino\js.jar" "%DIR%\pegjs-main.js" "%DIR%" %*
|
|
Binary file not shown.
Loading…
Reference in New Issue