UNPKG

apg-js-examples

Version:

Examples of using the suite of apg-js applications and libraries.

58 lines (54 loc) 2.23 kB
/* eslint-disable new-cap */ /* ************************************************************************************* * copyright: Copyright (c) 2021 Lowell D. Thomas, all rights reserved * license: BSD-2-Clause (https://opensource.org/licenses/BSD-2-Clause) * ********************************************************************************* */ // This module sets up an application to demonstrate how to call any arbitrary rule name `RNM` // callback function from any other callback function - in this case from a `UDT` callback. // (See the initial discussion for `colors-app.js` for the motivation // and cautionary tales of doing this kind of craziness.) module.exports = function moreSetup(udtcallback, title) { const nodeUtil = require('node:util'); const inspectOptions = { showHidden: true, depth: null, }; try { const { apgLib } = require('apg-js'); const grammar = new (require('./more'))(); const parser = new apgLib.parser(); parser.stats = new apgLib.stats(); parser.trace = new apgLib.trace(); parser.callbacks.u_more = udtcallback; const inputString = 'start more more'; const inputCharacterCodes = apgLib.utils.stringToChars(inputString); const startRule = 0; /* parse the input string */ const result = parser.parse(grammar, startRule, inputCharacterCodes); /* display parser results */ console.log(); console.log("the parser's results"); console.dir(result, inspectOptions); if (result.success === false) { throw new Error(`input string: '${inputString}' : parse failed`); } let html = ''; html += parser.stats.toHtml('hits', title); html += parser.trace.toHtml(title); /* Returns the statistics and trace displays to the application. The application will decide how to display it. */ return html; } catch (e) { let msg = '\nEXCEPTION THROWN: \n'; if (e instanceof Error) { msg += `${e.name}: ${e.message}`; } else if (typeof e === 'string') { msg += e; } else { msg += nodeUtil.inspect(e, inspectOptions); } process.exitCode = 1; console.log(msg); throw e; } };