|
|
|
"use strict";
|
|
|
|
|
|
|
|
const { expect, use } = require( "chai" );
|
|
|
|
const helpers = require( "./helpers" );
|
|
|
|
const pass = require( "pegjs" ).compiler.passes.check.reportIncorrectPlucking;
|
|
|
|
|
|
|
|
use( helpers );
|
|
|
|
|
|
|
|
describe( "compiler pass |reportIncorrectPlucking|", function () {
|
|
|
|
|
|
|
|
function reports( error, edgecases ) {
|
|
|
|
|
|
|
|
it( error.slice( 0, -1 ), () => {
|
|
|
|
|
|
|
|
edgecases.forEach( grammar => expect( pass ).to.reportError( grammar, error ) );
|
|
|
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
reports( `"@" cannot be used with an action block.`, [
|
|
|
|
|
|
|
|
`start1 = 'a' @'b' 'c' { /* empty action block */ }`,
|
|
|
|
`start2 = 'a' @('b' @'c' { /* empty action block */ })`,
|
|
|
|
|
|
|
|
] );
|
|
|
|
|
|
|
|
reports( `"@" cannot be used on a semantic predicate.`, [
|
|
|
|
|
|
|
|
`start1 = 'a' @&{ /* semantic_and */ } 'c'`,
|
|
|
|
`start2 = 'a' @!{ /* semantic_not */ } 'c'`,
|
|
|
|
|
|
|
|
] );
|
|
|
|
|
|
|
|
it( "allows valid plucking", function () {
|
|
|
|
|
|
|
|
expect( pass ).not.to.reportError( `
|
|
|
|
|
|
|
|
start1 = @'1' // return '1'
|
|
|
|
start2 = @'1' / @'2' // return '1' or '2'
|
|
|
|
start2 = '1' @'2' '3' // return '2'
|
|
|
|
start3 = '1' @b:'2' '3' // return '2', label "b" can be used in semantic predicates
|
|
|
|
start4 = a:'1' @b:'2' '3' // return '2', labels "a" and "b" can be used in semantic predicates
|
|
|
|
start5 = @'1' @'2' '3' // return ['1', '2']
|
|
|
|
start6 = @'1' @b:'2' '3' // return ['1', '2'], label "b" can be used in semantic predicates
|
|
|
|
start7 = a:'1' @'2' &{} // return '2' if the semantic predicate doesnt fail
|
|
|
|
|
|
|
|
` );
|
|
|
|
|
|
|
|
} );
|
|
|
|
|
|
|
|
} );
|