pegjs-livescript-plugin
v0.2.0
Published
PEG.js LiveScript plugin
Downloads
2
Maintainers
Readme
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. :smile:
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 plugin
parser = 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
)