UNPKG

@fauton/cfg

Version:

A package to work with context free grammars and LL1 parsers

41 lines (40 loc) 1.89 kB
"use strict"; 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;