38 lines
891 B
JavaScript
38 lines
891 B
JavaScript
import grammar from '/imports/parser/grammar.js';
|
|
import nearley from 'nearley';
|
|
|
|
const nearleyGrammar = nearley.Grammar.fromCompiled(grammar);
|
|
|
|
export default function parser(){
|
|
return new nearley.Parser(nearleyGrammar);
|
|
}
|
|
|
|
export class CompilationContext {
|
|
constructor({doubleRolls} = {}){
|
|
this.errors = [];
|
|
this.rolls = [];
|
|
this.doubleRolls = doubleRolls;
|
|
}
|
|
storeError(e){
|
|
this.errors.push(e);
|
|
}
|
|
storeRoll(r){
|
|
this.rolls.push(r);
|
|
}
|
|
}
|
|
|
|
export function parse(string){
|
|
let parser = new nearley.Parser(nearleyGrammar);
|
|
parser.feed(string);
|
|
let results = parser.results;
|
|
if (results.length === 1){
|
|
return results[0];
|
|
} else if (results.length === 0){
|
|
// Valid parsing up until now, but need more. Unexpected end of input.
|
|
return null;
|
|
} else {
|
|
console.warn('Grammar is ambiguous!', {string, results});
|
|
return results[0];
|
|
}
|
|
}
|