@fauton/cfg
Version:
A package to work with context free grammars and LL1 parsers
41 lines (40 loc) • 1.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseWithLL1Table = void 0;
const generateLL1ParsingTable_1 = require("./generateLL1ParsingTable");
const generateParseTreeFromDerivations_1 = require("./generateParseTreeFromDerivations");
const populateCfg_1 = require("./utils/populateCfg");
function parseWithLL1Table(inputCfg, textContent) {
const derivations = [];
const cfg = (0, populateCfg_1.populateCfg)(inputCfg);
const { parseTable } = (0, generateLL1ParsingTable_1.generateLL1ParsingTable)(cfg);
const ruleStack = ["$", cfg.startVariable];
let lookAheadPointer = 0;
let parsed = null;
while (ruleStack.length !== 1 && lookAheadPointer !== textContent.length) {
const variableAtStackTop = ruleStack.pop();
if (variableAtStackTop === textContent[lookAheadPointer]) {
lookAheadPointer += 1;
}
else {
const char = textContent[lookAheadPointer];
if (char in parseTable[variableAtStackTop]) {
const ruleNumber = parseTable[variableAtStackTop][char];
const productionRule = cfg.productionRules[variableAtStackTop][ruleNumber];
const productionRuleTokens = productionRule.split(" ");
ruleStack.push(...[...productionRuleTokens].reverse());
derivations.push([variableAtStackTop, productionRuleTokens]);
}
else {
parsed = false;
break;
}
}
}
return {
parsed: parsed !== null && parsed !== void 0 ? parsed : (ruleStack.length === 1 && ruleStack[0] === "$"),
derivations,
tree: (0, generateParseTreeFromDerivations_1.generateParseTreeFromDerivations)(cfg.variables, derivations)
};
}
exports.parseWithLL1Table = parseWithLL1Table;