From d02098eebecc65f292b8406b81921f918e7df217 Mon Sep 17 00:00:00 2001 From: David Majda Date: Fri, 11 Jan 2013 20:35:18 +0100 Subject: [PATCH] Plugin API: Implement the |passes| parameter for |PEG.compiler.compile| The |passes| parameter will allow to pass the list of passes from |PEG.buildParser|. This will be used by plugins. The old way via setting the |appliedPassNames| property is removed. Implements part of GH-106. --- lib/compiler.js | 21 +++------------------ lib/peg.js | 8 +++++++- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/lib/compiler.js b/lib/compiler.js index b116e78..febdd81 100644 --- a/lib/compiler.js +++ b/lib/compiler.js @@ -16,27 +16,14 @@ module.exports = { generateJavascript: require("./compiler/passes/generate-javascript") }, - /* - * Names of passes that will get run during the compilation (in the specified - * order). - */ - appliedPassNames: [ - "reportMissingRules", - "reportLeftRecursion", - "removeProxyRules", - "generateBytecode", - "generateJavascript" - ], - /* * Generates a parser from a specified grammar AST. Throws |PEG.GrammarError| * if the AST contains a semantic error. Note that not all errors are detected * during the generation and some may protrude to the generated parser and * cause its malfunction. */ - compile: function(ast) { - var that = this, - options = arguments.length > 1 ? utils.clone(arguments[1]) : {}; + compile: function(ast, passes) { + var options = arguments.length > 2 ? utils.clone(arguments[2]) : {}; utils.defaults(options, { allowedStartRules: [ast.rules[0].name], @@ -45,9 +32,7 @@ module.exports = { output: "parser" }); - utils.each(this.appliedPassNames, function(passName) { - that.passes[passName](ast, options); - }); + utils.each(passes, function(p) { p(ast, options); }); switch (options.output) { case "parser": return eval(ast.code); diff --git a/lib/peg.js b/lib/peg.js index ff4e724..56efd57 100644 --- a/lib/peg.js +++ b/lib/peg.js @@ -1,3 +1,5 @@ +var utils = require("./utils"); + module.exports = { /* PEG.js version (uses semantic versioning). */ VERSION: "0.7.0", @@ -18,6 +20,10 @@ module.exports = { * generated parser and cause its malfunction. */ buildParser: function(grammar, options) { - return this.compiler.compile(this.parser.parse(grammar), options); + return this.compiler.compile( + this.parser.parse(grammar), + utils.values(this.compiler.passes), + options + ); } };