@parser-generator/core
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
49 lines • 2.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const definition_1 = require("./definition");
const debug_1 = __importDefault(require("debug"));
let debug = debug_1.default("PG:automata");
/**
* 构造一个由项集组成的状态机,(详见 #自动机的构造)
* @param grammar
* @param tools
*/
function getAutomata(grammar, tools) {
//状态id计数
let stateIdCounter = 1;
// let I0 = new State(stateIdCounter++, closure(new ItemSet(new Item(grammar.prodOfStartNT))))
let I0 = tools.getStartState(grammar);
debug(`${I0}`);
//存放状态集
let stateSet = new definition_1.StateSet();
stateSet.push(I0);
//状态集中待处理的 状态的索引
let procssedIdx = 0;
//每一个状态集中尚未处理的状态
while (procssedIdx < stateSet.length) {
let curState = stateSet[procssedIdx++];
//得到当前状态的后继符号集
let nextSymbols = curState.getNextSymbols();
//对当前状态输入 符号集 中的每个符号
for (let nextSymbol of nextSymbols) {
//生成当前状态对输入(nextSymbol)的后继状态
let nextItemSet = tools.GOTO(curState, nextSymbol);
//检查生成的状态是否已经存在 (判断状态相等标准见:ItemSet.equals())
let nextState = stateSet.getExisting(nextItemSet);
if (nextState == null) {
nextState = new definition_1.State(stateIdCounter++, nextItemSet);
stateSet.push(nextState);
debug(`\n+Adding a new state:\n${nextState}\n`);
}
//记录当前状态 与 后继状态 的连接
curState.addNextState(nextSymbol, nextState);
debug(`mapping: ${curState.id} ----- ${nextSymbol} -----> ${nextState.id}`);
}
}
return stateSet;
}
exports.getAutomata = getAutomata;
//# sourceMappingURL=automata.js.map