This is very brief announcement to say that I’ve just released a new PEG parser-compiler for JavaScript, called Canopy. It generates fast, self-contained parser modules from grammar definition files and runs in all the major browsers and on CommonJS platforms including Node.js, Narwhal and RingoJS.
Why do we need another PEG compiler? We don’t. PEG.js is excellent, actively used and maintained and has a really nice website. Canopy exists mostly for reasons of personal taste: I wanted something more akin to Treetop, which lets you keep the grammar definition separate from any methods you add to the parse tree. In fact, Canopy goes further than this: you have to keep them separate, you cannot have inline JavaScript in the grammar files. JavaScript goes in JavaScript files with all your other JavaScript.
It’s taken rather a while to release. I initially wrote it as part of a huge
yak-shaving exercise: I was trying to get Terminus to work in IE, which
doesn’t support the document.evaluate()
API. I thought it would be a fun idea
to reimplement it, so I created a project called Pathology, an ad-hoc,
informally specified, bug-ridden slow implementation of half of XPath for IE. Of
course this meant parsing XPath queries, which I wasn’t going to do by hand, so
I thought it would even more fun to learn how parser compilers work and build
one. Pathology never really panned out, although it turns out Android browsers
don’t have XPath either so I might revive it, you never know.
I also used Canopy to build Fargo, my fiber-aware version of Scheme. It’s great for getting a new language off the ground quickly.
So, after two years of off-and-on development, and after some interest from a
few other people, a couple of months ago I finally got around to documenting it,
getting rid of some annoying dependencies (the parsers it generates are now
completely self-contained and work on lots of JS platforms), and testing it
properly. It’s available by running npm install -g canopy
, or from the
website, along with the documentation. Let me know what you think.