Merge ast utils into Grammar class
parent
1a713d0175
commit
9d266625b4
@ -1,102 +0,0 @@
|
||||
"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;
|
Loading…
Reference in New Issue