"use strict"; const visitor = require( "./visitor" ); // AST utilities. const asts = { findRule( ast, name ) { for ( let i = 0; i < ast.rules.length; i++ ) { if ( ast.rules[ i ].name === name ) return ast.rules[ i ]; } return void 0; }, indexOfRule( ast, name ) { for ( let i = 0; i < ast.rules.length; i++ ) { if ( ast.rules[ i ].name === name ) return i; } return -1; }, alwaysConsumesOnSuccess( ast, node ) { let consumes; function consumesTrue() { return true; } function consumesFalse() { return false; } function consumesExpression( node ) { return consumes( node.expression ); } consumes = visitor.build( { rule: consumesExpression, named: consumesExpression, choice( node ) { return node.alternatives.every( consumes ); }, action: consumesExpression, sequence( node ) { return node.elements.some( consumes ); }, labeled: consumesExpression, text: consumesExpression, simple_and: consumesFalse, simple_not: consumesFalse, optional: consumesFalse, zero_or_more: consumesFalse, one_or_more: consumesExpression, group: consumesExpression, semantic_and: consumesFalse, semantic_not: consumesFalse, rule_ref( node ) { return consumes( asts.findRule( ast, node.name ) ); }, literal( node ) { return node.value !== ""; }, class: consumesTrue, any: consumesTrue } ); return consumes( node ); } }; module.exports = asts;