9 changed files with 119 additions and 122 deletions
@ -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