From c340b82765c9119db5970c27c7f1b4fe4212a02a Mon Sep 17 00:00:00 2001 From: Sammy Chu Date: Tue, 5 May 2015 17:07:49 +0800 Subject: [PATCH] #282,#283 - support specifying moduleName on CLI, support generate namespace for the generated parser object --- lib/cli.js | 17 ++++++++++------- lib/jison.js | 28 ++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/cli.js b/lib/cli.js index 4bd502528..79a13da33 100755 --- a/lib/cli.js +++ b/lib/cli.js @@ -39,6 +39,11 @@ function getCommandlineOptions () { metavar : 'TYPE', help : 'The type of module to generate (commonjs, amd, js)' }) + .option('module-name', { + abbr : 'n', + metavar : 'NAME', + help : 'The name of the generated parser object, namespace supported' + }) .option('parser-type', { abbr : 'p', default: @@ -93,15 +98,10 @@ cli.main = function cliMain(opts) { // if they aren't specified. var name = path.basename((opts.outfile || opts.file)); - name = name.replace(/\..*$/g, ''); + // get the base name (i.e. the file name without extension) + name = path.basename(name, path.extname(name)); opts.outfile = opts.outfile || (name + '.js'); - if (!opts.moduleName && name) { - opts.moduleName = name.replace(/-\w/g, - function (match) { - return match.charAt(1).toUpperCase(); - }); - } var parser = processGrammar(raw, lex, opts); fs.writeFileSync(opts.outfile, parser); @@ -148,6 +148,9 @@ cli.generateParserString = function generateParserString(opts, grammar) { if (!settings.moduleType) { settings.moduleType = opts['module-type']; } + if (!settings.moduleName) { + settings.moduleName = opts['module-name']; + } var generator = new jison.Generator(grammar, settings); return generator.generate(settings); diff --git a/lib/jison.js b/lib/jison.js index 789307f6e..ccff01a9e 100755 --- a/lib/jison.js +++ b/lib/jison.js @@ -928,10 +928,7 @@ lrGeneratorMixin.generate = function parser_generate (opt) { opt = typal.mix.call({}, this.options, opt); var code = ""; - // check for illegal identifier - if (!opt.moduleName || !opt.moduleName.match(/^[A-Za-z_$][A-Za-z0-9_$]*$/)) { - opt.moduleName = "parser"; - } + opt.moduleName = opt.moduleName || "parser"; switch (opt.moduleType) { case "js": code = this.generateModule(opt); @@ -1054,8 +1051,27 @@ lrGeneratorMixin.generateModule = function generateModule (opt) { + " recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n" + " }\n" + "*/\n"; - out += (moduleName.match(/\./) ? moduleName : "var "+moduleName) + - " = " + this.generateModuleExpr(); + + var self = this; + var _generateNamespace = function (namespaces, previousNamespace, callback) { + var subModuleName = namespaces.shift(); + if (subModuleName != null) { + var moduleName = previousNamespace == null ? subModuleName : previousNamespace + "." + subModuleName; + if (namespaces.length > 0) { + return "var " + subModuleName + ";\n" + + "(function (" + subModuleName + ") {\n" + + _generateNamespace(namespaces, subModuleName, callback) + + "})(" + subModuleName + (previousNamespace == null ? "" : " = " + moduleName) + " || (" + moduleName + " = {}));\n"; + } + return callback(moduleName); + } + return ""; + }; + + out += _generateNamespace(moduleName.split('.'), null, function (moduleName) { + return (moduleName.match(/\./) ? moduleName : "var "+moduleName) + + " = " + self.generateModuleExpr() + "\n"; + }); return out; };