A grunt multi task that generates parsers from PEG grammars.
npm install grunt-peg> A grunt multi task that generates parsers from PEG grammars.
>=0.4.0If you haven't used [Grunt][] before, be sure to check out the
[Getting Started][] guide, as it explains how to create a
[Gruntfile][] as well as install and use Grunt plugins. Once you're
familiar with that process, you may install this plugin with this
command:
``shell`
npm install grunt-peg --save-dev
One the plugin has been installed, it may be enabled inside your
Gruntfile with this line of JavaScript:
`js`
grunt.loadNpmTasks('grunt-peg');
command._Task targets, files and options may be specified according to the grunt Configuring tasks guide.
$3
Any specified option will be passed through directly to [PEG.js][], thus you can specify any option that PEG.js supports. See the [PEG.js documentation][] for a list of supported options.
[PEG.js]: http://pegjs.majda.cz/
[PEG.js documentation]: http://pegjs.majda.cz/documentation
An additional option is supported:
#### exportVar
Type:
String | function
Default value: 'module.exports'The variable to which the generated parser will be assigned in the output file.
If the
exportVar is of type function, the function needs to return
the variable as a String. The function gets passed the src
variable to base the variable off.$3
#### Default Options
In this example a [PEG][] grammar as described in the file
grammar/example.peg is used to generate parser
grammar/example.js. The default export variable is used,
i.e. module.exports.`js
grunt.initConfig({
peg: {
example: {
src: "grammar/example.peg",
dest: "grammar/example.js"
}
}
})
`#### Custom Options
In this example a [PEG][] grammar as described in the file
grammar/example.peg is used to generate parser
grammar/example.js, the export variable being Example.parser.`js
grunt.initConfig({
peg: {
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: { exportVar: "Example.parser" }
}
}
})
`#### Dynamic
exportVarIn this example a [PEG][] grammar as described in the file
grammar/example.peg is used to generate parser
grammar/example.js, the export variable being defined via a function
and will result in example.`js
grunt.initConfig({
peg: {
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: { exportVar: function(src){ return path.basename(src[0], '.peg'); } }
}
}
})
`#### Passing Options to PEG
In this example a [PEG][] grammar as described in the file
grammar/example.peg is used to generate parser
grammar/example.js, the export variable being Example.parser.
Both the task-specific trackLineAndColumn and target-specific
cache options will be passed through to PEG.js.`js
grunt.initConfig({
peg: {
options: { trackLineAndColumn: true },
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: {
exportVar: "Example.parser",
cache: true
}
}
}
})
`#### Wrap in an Angular Factory
It is also possible to wrap the generated parser in an Angular
factory.
`js
grunt.initConfig({
peg: {
options: { trackLineAndColumn: true },
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: {
angular: {
module: "pegjs",
factory: "exampleParser"
}
}
}
}
})
`#### Custom Wrapper
It is also possible to wrap the generated parser in any code you
want.
`js
grunt.initConfig({
peg: {
options: { trackLineAndColumn: true },
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: {
wrapper: function (src, parser) {
return 'define("example", [], function () { return ' + parser + '; });';
}
}
}
}
})
`##### Note on plugins
If you want to pass plugins to PEG.js make sure that the plugin is
installed and referenced by the module name. For example, for the
[pegjs-coffee-plugin][] one should first install the plugin
`js
npm install --save-dev pegjs-coffee-plugin
`and then configure the tasks with the module name.
`js
grunt.initConfig({
peg: {
options: { trackLineAndColumn: true },
example : {
src: "grammar/example.peg",
dest: "grammar/example.js",
options: {
plugins: [ "pegjs-coffee-plugin" ]
}
}
}
})
`PEG.js dependency
As described in [issue #6][#6] sometimes the wrong PEG.js version
is downloaded by npm. The solution for now seems to be to call
npm cache clear.Contributing
In lieu of a formal styleguide, take care to maintain the existing
coding style. Add unit tests for any new or changed
functionality. Lint and test your code using
Grunt.
Release History
* 2016-02-23 v2.0.1 Update
grunt peer dependency
* 2015-09-11 v2.0.0 Update version of PEG.js to 0.9.0
* 2014-08-02 v1.5.0 Custom wrapper
* 2014-06-09 v1.4.0 Dynamic exportVar`* [welwood08][]
* [mstefaniuk][]
* [bertrandgressier][]
* [kmdavis][]
* [felixhao28][]
[welwood08]: https://github.com/welwood08
[mstefaniuk]: https://github.com/mstefaniuk
[bertrandgressier]: https://github.com/bertrandgressier
[kmdavis]: https://github.com/kmdavis
[felixhao28]: https://github.com/felixhao28
[Grunt]: http://gruntjs.com/
[Getting Started]: http://gruntjs.com/getting-started
[PEG]: https://npmjs.org/package/pegjs
[Gruntfile]: http://gruntjs.com/sample-gruntfile
[#6]: https://github.com/dvberkel/grunt-peg/pull/6
[pegjs-coffee-plugin]: https://github.com/Dignifiedquire/pegjs-coffee-plugin