UNPKG

@parser-generator/grammar-interpreter

Version:

A Parser Generator that supports LL,SLR,LR1,LALR

94 lines 2.73 kB
import { isNonTerminal } from "@parser-generator/definition"; export function lrTableToDimArr(parsingTable) { let table = new Array(); let cols = new Set(); for (let P of parsingTable.table.values()) for (let symbol of P.keys()) cols.add(symbol); let headers = Array.from(cols.keys()).map(i => i + ""); headers.unshift(""); table.push(headers); for (let [k, v] of parsingTable.table) { let row = []; row.push(k + ""); for (let c of cols) { if (v.has(c)) { row.push(v.get(c) + ""); } else { row.push(""); } } table.push(row); } return table; } export function lrAutomataToGraph(stateSet) { //state set graph let nodes = []; let edges = []; let count = 0; let size = Math.round(Math.sqrt(stateSet.length)); for (let state of stateSet) { nodes.push({ id: state.id, label: `${state.toString()}`, x: count % size * 400, y: Math.floor(count / size) * 400 }); for (let [label, to] of state.mapping) { edges.push({ from: state.id, to: to.id, label: isNonTerminal(label) ? label.name : (typeof label === "string" ? `"${label.replace(/"/g, "\\\"")}"` : label) }); } count++; } return { nodes, edges }; } export function followTableToDimArr(followTable) { let table = new Array(); let tokens = new Set(); for (let P of followTable.values()) for (let token of P.keys()) tokens.add(token); let headers = Array.from(tokens).map(i => i + ""); headers.unshift(""); table.push(headers); for (let [k, v] of followTable) { let row = []; row.push(k + ""); for (let token of tokens) { if (v.has(token)) row.push(`y`); else row.push(""); } table.push(row); } return table; } export function firstTableToDimArr(firstTable) { let table = new Array(); let tokens = new Set(); for (let P of firstTable.values()) for (let token of P.keys()) tokens.add(token); let headers = Array.from(tokens).map(i => i + ""); headers.unshift(""); table.push(headers); for (let [k, v] of firstTable) { let row = []; row.push(k + ""); for (let token of tokens) { if (v.has(token)) row.push(v.get(token).id + ""); else row.push(""); } table.push(row); } return table; } //# sourceMappingURL=adapter.js.map