In [37]:
var acorn = require('acorn')

acorn.tokTypes.YALP = new acorn.TokenType("YALP")

acorn.plugins.yalp = function(instance){

instance.extend("parseExpression", function(inner) {
    return function(noIn, refShorthandDefaultPos){
	 var startPos = this.start, startLoc = this.startLoc
     var thing = inner.call(this);
      if(this.eat(acorn.tokTypes.YALP)){
//           console.log('YAWLP', this, thing)
          var node = this.startNodeAt(startPos, startLoc)
          node.arguments = [thing]
          var clog = this.startNode()
          clog.name = "log"
          node.callee = this.finishNode(clog, "Identifier")
          return this.finishNode(node, "CallExpression")
      }
        return thing
  };
});    
    instance.extend("readToken", function(inner){
        return function(code){
            var context = this.curContext();
            if(code == 33){ // !
                ++this.pos;
                return this.finishToken(acorn.tokTypes.YALP)
            }
            return inner.call(this, code)
        }
    })
}

var comments = [], tokens = [];
var escodegen = require('escodegen')
var ast = acorn.parse(`
var n = 500, k = 1;
for(var i = 0; i < 100; i++){
	k = k / 2 * (3 - n * k * k)
    5!
    blah!
}
`, {
    plugins: {
        yalp: true
    },
       ranges: true,
    // collect comments in Esprima's format
    onComment: comments,
    // collect token ranges
    onToken: tokens
})

// attach comments using collected information
escodegen.attachComments(ast, comments, tokens);
// console.log(ast)
// generate code
console.log(escodegen.generate(ast, {comment: true}));


var n = 500, k = 1;
for (var i = 0; i < 100; i++) {
    k = k / 2 * (3 - n * k * k);
    log(5);
    log(blah);
}
Out[37]:
undefined

In [20]:
process.cwd()


Out[20]:
'/Users/kevin/Projects/gayfish/experiment'

In [26]:
module.paths.push('/Users/kevin/Projects/gayfish/experiment/node_modules')


Out[26]:
7

In [ ]: