UNPKG

parse-vbb-station-name

Version:
55 lines (46 loc) 1.38 kB
'use strict' const {Parser, Grammar} = require('nearley') const grammar = require('./lib/grammar') const parseVbbStationName = (name) => { if ('string' !== typeof name) throw new TypeError('name must be a string') // todo: optimize this const parser = new Parser(Grammar.fromCompiled(grammar)) // parser.restore() // parser.save() try { parser.feed(name.trim()) parser.finish() } catch (err) { err.isParseError = true err.input = name throw err } if (parser.results.length === 0) { const err = new Error(`no parse results with "${name}"`) err.isParseError = true err.input = name err.results = parser.results throw err } if (parser.results.length > 1) { const err = new Error(`grammar is ambiguous with "${name}"`) err.isParseError = true err.input = name err.results = parser.results throw err } const res = parser.results[0] // remove group name from name // (not sure if this messes some names up) const g = res.group const n = res.name if (g && g.text && n && n.text && n.text.slice(0, g.text.length + 1) === g.text + ' ') { n.text = n.text.slice(g.text.length + 1) } // this assumes that .value works just like .text if (g && g.value && n && n.value && n.value.slice(0, g.value.length + 1) === g.value + ' ') { n.value = n.value.slice(g.value.length + 1) } return res } module.exports = parseVbbStationName