You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
var arrays = require("../utils/arrays"),
|
|
visitor = require("./visitor");
|
|
|
|
/* AST utilities. */
|
|
var asts = {
|
|
findRule: function(ast, name) {
|
|
return arrays.find(ast.rules, function(r) { return r.name === name; });
|
|
},
|
|
|
|
indexOfRule: function(ast, name) {
|
|
return arrays.indexOf(ast.rules, function(r) { return r.name === name; });
|
|
},
|
|
|
|
matchesEmpty: function(ast, node) {
|
|
function matchesTrue() { return true; }
|
|
function matchesFalse() { return false; }
|
|
|
|
function matchesExpression(node) {
|
|
return matches(node.expression);
|
|
}
|
|
|
|
var matches = visitor.build({
|
|
rule: matchesExpression,
|
|
|
|
choice: function(node) {
|
|
return arrays.some(node.alternatives, matches);
|
|
},
|
|
|
|
action: matchesExpression,
|
|
|
|
sequence: function(node) {
|
|
return arrays.every(node.elements, matches);
|
|
},
|
|
|
|
labeled: matchesExpression,
|
|
text: matchesExpression,
|
|
simple_and: matchesTrue,
|
|
simple_not: matchesTrue,
|
|
optional: matchesTrue,
|
|
zero_or_more: matchesTrue,
|
|
one_or_more: matchesExpression,
|
|
semantic_and: matchesTrue,
|
|
semantic_not: matchesTrue,
|
|
|
|
rule_ref: function(node) {
|
|
return matches(asts.findRule(ast, node.name));
|
|
},
|
|
|
|
literal: function(node) {
|
|
return node.value === "";
|
|
},
|
|
|
|
"class": matchesFalse,
|
|
any: matchesFalse
|
|
});
|
|
|
|
return matches(node);
|
|
}
|
|
};
|
|
|
|
module.exports = asts;
|