35 lines
884 B
JavaScript
35 lines
884 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 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
|
|
throw new EndOfInputError('Unexpected end of input');
|
|
} else {
|
|
console.warn('Grammar is ambiguous!', {string, results});
|
|
return results[0];
|
|
}
|
|
}
|
|
|
|
export function prettifyParseError(e){
|
|
if (e.message) e = e.message
|
|
return e.toString().split('.')[0];
|
|
}
|
|
|
|
class EndOfInputError extends Error {
|
|
constructor(message = '', ...args) {
|
|
super(message, ...args);
|
|
}
|
|
}
|