diff --git a/lib/jison.js b/lib/jison.js index 789307f6e..1af81fb9b 100755 --- a/lib/jison.js +++ b/lib/jison.js @@ -1338,6 +1338,7 @@ lrGeneratorMixin.createParser = function createParser () { } // backwards compatability + p.lexer = this.lexer; p.generate = bind('generate'); p.generateAMDModule = bind('generateAMDModule'); p.generateModule = bind('generateModule'); diff --git a/tests/parser/generator.js b/tests/parser/generator.js index dc73a5af8..2ef535dd9 100644 --- a/tests/parser/generator.js +++ b/tests/parser/generator.js @@ -2,6 +2,9 @@ var Jison = require("../setup").Jison, Lexer = require("../setup").Lexer, assert = require("assert"); +var fs = require('fs'); +var path = require('path'); + exports["test amd module generator"] = function() { var lexData = { rules: [ @@ -346,3 +349,33 @@ exports["test module include with each generator type"] = function () { assert.ok(/TEST_VAR/.test(source), type + " supports module include"); }); }; + +// test for issue #246 +exports["test compiling a parser/lexer"] = function () { + var grammar = + '// Simple "happy happy joy joy" parser, written by Nolan Lawson\n' + + '// Based on the song of the same name.\n\n' + + '%lex\n%%\n\n\\s+ /* skip whitespace */\n' + + '("happy") return \'happy\'\n' + + '("joy") return \'joy\'\n' + + '<> return \'EOF\'\n\n' + + '/lex\n\n%start expressions\n\n' + + '%ebnf\n\n%%\n\n' + + 'expressions\n : e EOF\n {return $1;}\n ;\n\n' + + 'e\n : phrase+ \'joy\'? -> $1 + \' \' + yytext \n ;\n\n' + + 'phrase\n : \'happy\' \'happy\' \'joy\' \'joy\' ' + + ' -> [$1, $2, $3, $4].join(\' \'); \n ;'; + + var parser = new Jison.Parser(grammar); + var generated = parser.generate(); + + var tmpFile = path.resolve(__dirname, 'tmp-parser.js'); + fs.writeFileSync(tmpFile, generated); + var parser2 = require('./tmp-parser'); + + assert.ok(parser.parse('happy happy joy joy joy') === 'happy happy joy joy joy', + 'original parser works'); + assert.ok(parser2.parse('happy happy joy joy joy') === 'happy happy joy joy joy', + 'generated parser works'); + fs.unlinkSync(tmpFile); +};