@parser-generator/core
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
103 lines • 3.01 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const shim_1 = require("@light0x00/shim");
const definition_1 = require("@parser-generator/definition");
exports.getMock = (fullpath) => fs_1.default.readFileSync(fullpath, "utf8");
class SimpleGrammar {
constructor(rawGrammar) {
this._prodIdCounter = 0;
this._nonTerminals = [];
this._productions = [];
this._prodMap = new Map();
this.construct(rawGrammar);
}
beforeConstruct(rawGrammar) {
shim_1.assert(rawGrammar.length > 0);
}
construct(rawGrammar) {
this.beforeConstruct(rawGrammar);
//每一个非终结符
for (let x of rawGrammar) {
shim_1.assert(x.length > 1 && x[0] instanceof definition_1.NonTerminal);
let nt = x[0];
this._nonTerminals.push(x[0]);
nt.prods = [];
//非终结符的每一个产生式
for (let i = 1; i < x.length; i++) {
let rowProd = x[i];
shim_1.assert(rowProd instanceof Array);
let actionSyms = [];
//每一个符号
for (let rawSym of rowProd) {
actionSyms.push(new definition_1.SymbolWrapper(rawSym));
}
let prod = new definition_1.Production(this._prodIdCounter++, x[0], actionSyms);
nt.prods.push(prod);
this._prodMap.set(prod.id, prod);
this._productions.push(prod);
}
}
this.afterConstruct();
}
afterConstruct() {
//Implement in subclasses
}
nonTerminals() {
return this._nonTerminals;
}
productions() {
return this._productions;
}
//start symbol
startNT() {
return this._nonTerminals[0];
}
toString() {
return this._productions.join("\n");
}
}
exports.SimpleGrammar = SimpleGrammar;
class MockToken {
constructor(key, val = key) {
this._key = key;
this._val = val;
}
key() {
return this._key;
}
get value() {
return this._val;
}
toString() {
return this.value.toString();
}
}
exports.MockToken = MockToken;
class MockLexer {
constructor(ts) {
this.index = 0;
this.tokens = ts;
}
peek() {
if (this.index > this.tokens.length - 1) {
return new MockToken(definition_1.EOF);
}
else {
return this.tokens[this.index];
}
}
next() {
if (this.index > this.tokens.length - 1) {
return new MockToken(definition_1.EOF);
}
else {
return this.tokens[this.index++];
}
}
}
exports.MockLexer = MockLexer;
//# sourceMappingURL=toolkit.js.map