PEG.js LiveScript plugin
PEG.js is a great tool for generating parsers in JavaScript with very concise grammar.
For more in-depth entertainment on packrat parsers and PEGs;
here is the wild stuff Packrat Parsing and Parsing Expression Grammars.
LiveScript is a glorious language which compiles to JavaScript. The everything-is-expression style and its sugary syntax makes me a smile every time. 😄
This plugin, following the example of the existing CoffeeScript plugins [Dignifiedquire/pegjs-coffee-plugin, ttilley/pegcoffee], allows writing PEG.js grammar with LiveScript code in initializer, actions and predicates.
There is a little difference in comparison with Coffee plugins.
Context this
or @
remains unchanged.
Installation
$ npm install pegjs-livescript-plugin
Usage
Node.js
require! { PEG, 'pegjs-livescript-plugin' } grammar = "Start = cs:.* { cs.join '' }" # Build parser with LiveScript pluginparser = PEG.buildParser grammar, plugins: [pegjs-livescript-plugin] parser.parse 'PEG is fun!'
CLI
$ pegjs --plugin pegjs-livescript-plugin my-grammar.pegls
PEG.js LiveScript
// .pegls - PEG.js LiveScript grammar{ my-var = 42 join-chars = (chars) -> chars.join ''} Start = cs:.* { # my-var := 4711 # SyntaxError: assignment to undeclared "myVar" my-var = 4711 # initializer variable `my-var == 42` is shadowed join-chars cs }
compiles to JavaScript
{ var myVar, joinChars; myVar = 42; joinChars = function(chars){ return myVar + chars.join(''); // myVar === 42 };} Start = ch:.* { var myVar; return myVar = 4711, joinChars(cs); }
Note: variables defined in one scope (between {
}
) can not be modified in a different scope
not even with :=
. Each scope is compiled separately which causes re-declaration of variables.
It seems to me that this is actually a smart restriction (consequence) but I'm open to suggestions.
Tests
$ npm test
Todo
- browser build/test
- better compile/runtime error report (sourcemap?!)
- accept compiler options (eg.
const: true
)