@parser-generator/core
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
95 lines • 2.62 kB
JavaScript
import fs from "fs";
import { assert } from "@light0x00/shim";
import { SymbolWrapper, EOF, NonTerminal, Production } from "@parser-generator/definition";
export const getMock = (fullpath) => fs.readFileSync(fullpath, "utf8");
export class SimpleGrammar {
constructor(rawGrammar) {
this._prodIdCounter = 0;
this._nonTerminals = [];
this._productions = [];
this._prodMap = new Map();
this.construct(rawGrammar);
}
beforeConstruct(rawGrammar) {
assert(rawGrammar.length > 0);
}
construct(rawGrammar) {
this.beforeConstruct(rawGrammar);
//每一个非终结符
for (let x of rawGrammar) {
assert(x.length > 1 && x[0] instanceof NonTerminal);
let nt = x[0];
this._nonTerminals.push(x[0]);
nt.prods = [];
//非终结符的每一个产生式
for (let i = 1; i < x.length; i++) {
let rowProd = x[i];
assert(rowProd instanceof Array);
let actionSyms = [];
//每一个符号
for (let rawSym of rowProd) {
actionSyms.push(new SymbolWrapper(rawSym));
}
let prod = new 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");
}
}
export 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();
}
}
export class MockLexer {
constructor(ts) {
this.index = 0;
this.tokens = ts;
}
peek() {
if (this.index > this.tokens.length - 1) {
return new MockToken(EOF);
}
else {
return this.tokens[this.index];
}
}
next() {
if (this.index > this.tokens.length - 1) {
return new MockToken(EOF);
}
else {
return this.tokens[this.index++];
}
}
}
//# sourceMappingURL=toolkit.js.map