RegJSTraverse
Traverse the RegJS AST (a AST for JavaScript's regular expressions).
Installation
npm install regjstraverse
Testing
To run the tests, run the following command:
npm test
Background
A RegJS AST can be generated by using the regjsparser
library:
var ast = require('regjsparser').parse('abc');
Example Usage
regjstraverse
makes it easy to traverse the regular expression AST using the
enter
and leave
functions:
var regjstraverse = require('regjstraverse');
regjstraverse.traverse(ast, {
enter: function(node) {
console.log('enter', node.type);
},
leave: function(node) {
console.log('leave', node.type);
}
})
When traversing the nodes, it's possible to skip the sub-nodes of the current
node by calling the this.skip()
method or returning regjstraverse.VisitorOption.Skip
:
var regjstraverse = require('regjstraverse');
regjstraverse.traverse(ast, {
enter: function(node) {
console.log('enter', node.type);
if (node.type === 'characterClass') {
this.skip();
return regjstraverse.VisitorOption.Skip;
}
},
leave: function(node) {
console.log('leave', node.type);
}
})
Breaking at the current point in the tree traversal is possible by invoking break
:
var regjstraverse = require('regjstraverse');
regjstraverse.traverse(ast, {
enter: function(node) {
console.log('enter', node.type);
if (node.type === 'characterClass') {
this.break();
return regjstraverse.VisitorOption.Break;
}
}
})
Note: After invoking break
stops the entire tree traversal - no further
calls to enter
or leave
are made afterwards.
Replacing the current visited node is doable using the replace
function:
var regjstraverse = require('regjstraverse');
var parse = require('regjsparser').parse;
var newAst = regjstraverse.replace(ast, {
enter: function(node) {
if (node.type === 'value') {
this.replace(parse('a'));
return parse('a');
}
}
})
Note: if the enter
function returns a new AST, the subnodes
of the new-replaced AST are visited. Example:
var regjstraverse = require('regjstraverse');
var regjsparser = require('regjsparser');
var rawValues = '';
var ast = regjstraverse.replace(regjsparser.parse('a|b'), {
enter: function(node, parent) {
if (node.type === 'disjunction') {
return regjsparser.parse('c|d');
} else {
rawValues += node.raw;
}
}
});
assert.equal(rawValues, 'cd');