Here is an universal parser in javascript
:
http://synth.wink.ws/moonyparser/
I've been to hell and back to make it faster, but that's it, shift-reduce can't be much faster. Unfortunately, finding errors in text makes it three times slower. At least it has linear parsing time.