Rakefile -> Jakefile
Or, swapped Ruby dependency for a Node dependency. The build script was also modified to always regenerate the parser (in case of the "parser" task) or rebuild the library (in case of the "build" task) even if the source files were not modified. Not doing this led to problems when the generating code changed but the files didn't (which happened often during development).redux
parent
814ce7d9db
commit
f3845726f2
@ -0,0 +1,72 @@
|
||||
var sys = require("sys");
|
||||
var fs = require("fs");
|
||||
|
||||
/* Relative paths are here because of use in |require|. */
|
||||
var SRC_DIR = "./src";
|
||||
var LIB_DIR = "./lib";
|
||||
var BIN_DIR = "./bin";
|
||||
|
||||
var PEGJS = BIN_DIR + "/pegjs";
|
||||
|
||||
var PEGJS_SRC_FILE = SRC_DIR + "/peg.js";
|
||||
var PEGJS_OUT_FILE = LIB_DIR + "/peg.js";
|
||||
|
||||
var PARSER_SRC_FILE = SRC_DIR + "/parser.pegjs";
|
||||
var PARSER_OUT_FILE = SRC_DIR + "/parser.js";
|
||||
|
||||
var PEGJS_VERSION = fs.readFileSync("VERSION", "utf8").trim();
|
||||
|
||||
var PEG = require(PEGJS_OUT_FILE);
|
||||
|
||||
function exitFailure() {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
function abort(message) {
|
||||
sys.error(message);
|
||||
exitFailure();
|
||||
}
|
||||
|
||||
desc("Generate the grammar parser");
|
||||
task("parser", [], function() {
|
||||
var input = fs.readFileSync(PARSER_SRC_FILE, "utf8");
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
fs.writeFileSync(PARSER_OUT_FILE, "PEG.parser = " + parser.toSource() + ";\n");
|
||||
});
|
||||
|
||||
desc("Build the peg.js file");
|
||||
task("build", ["parser"], function() {
|
||||
function preprocess(file) {
|
||||
var input = fs.readFileSync(file, "utf8").trim();
|
||||
return input.split("\n").map(function(line) {
|
||||
var matches = /^\s*\/\/\s*@include\s*"([^"]*)"\s*$/.exec(line);
|
||||
if (matches !== null) {
|
||||
var includedFile = SRC_DIR + "/" + matches[1];
|
||||
|
||||
try {
|
||||
fs.statSync(includedFile);
|
||||
} catch (e) {
|
||||
abort("Included file \"" + includedFile + "\" does not exist.");
|
||||
}
|
||||
|
||||
return preprocess(includedFile);
|
||||
} else {
|
||||
return line;
|
||||
}
|
||||
}).join("\n").replace("@VERSION", PEGJS_VERSION);
|
||||
}
|
||||
|
||||
fs.writeFileSync(PEGJS_OUT_FILE, preprocess(PEGJS_SRC_FILE), "utf8");
|
||||
});
|
||||
|
||||
task("default", ["build"], function() {});
|
@ -1,47 +0,0 @@
|
||||
SRC_DIR = "src"
|
||||
LIB_DIR = "lib"
|
||||
BIN_DIR = "bin"
|
||||
|
||||
PEGJS = "#{BIN_DIR}/pegjs"
|
||||
|
||||
SRC_FILES = Dir["#{SRC_DIR}/**/*.js"]
|
||||
|
||||
PEGJS_SRC_FILE = "#{SRC_DIR}/peg.js"
|
||||
PEGJS_OUT_FILE = "#{LIB_DIR}/peg.js"
|
||||
|
||||
PARSER_SRC_FILE = "#{SRC_DIR}/parser.pegjs"
|
||||
PARSER_OUT_FILE = "#{SRC_DIR}/parser.js"
|
||||
|
||||
PEGJS_VERSION = File.read("VERSION").strip
|
||||
|
||||
def preprocess(input, base_dir, version)
|
||||
input.split("\n").map do |line|
|
||||
if line =~ /^\s*\/\/\s*@include\s*"([^"]*)"\s*$/
|
||||
included_file = "#{base_dir}/#$1"
|
||||
if !File.exist?(included_file)
|
||||
abort "Included file \"#{included_file}\" does not exist."
|
||||
end
|
||||
preprocess(File.read(included_file), base_dir, version)
|
||||
else
|
||||
line
|
||||
end
|
||||
end.join("\n").gsub("@VERSION", version)
|
||||
end
|
||||
|
||||
file PARSER_OUT_FILE => PARSER_SRC_FILE do
|
||||
system "#{PEGJS} --export-var PEG.parser #{PARSER_SRC_FILE} #{PARSER_OUT_FILE}"
|
||||
end
|
||||
|
||||
file PEGJS_OUT_FILE => SRC_FILES do
|
||||
File.open(PEGJS_OUT_FILE, "w") do |f|
|
||||
f.write(preprocess(File.read(PEGJS_SRC_FILE), SRC_DIR, PEGJS_VERSION))
|
||||
end
|
||||
end
|
||||
|
||||
desc "Generate the grammar parser"
|
||||
task :parser => PARSER_OUT_FILE
|
||||
|
||||
desc "Build the peg.js file"
|
||||
task :build => PEGJS_OUT_FILE
|
||||
|
||||
task :default => :build
|
Loading…
Reference in New Issue