UNPKG

@parser-generator/core

Version:

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

70 lines 3.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const definition_1 = require("@parser-generator/definition"); const definition_2 = require("../lr/definition"); const lr1_1 = require("../lr/lr1"); const first_follow_1 = require("../first-follow"); require("should"); const toolkit_1 = require("./toolkit"); describe("============Calculation Of LR-Lookahead-Set Test============", function () { describe(` 青铜 S->A A->A𝜶 | A𝜷 | c `, function () { let S = new definition_1.NonTerminal("S"); let A = new definition_1.NonTerminal("A"); let grammar = new toolkit_1.SimpleGrammar([ [S, [A]], [A, [A, "a"], [A, "b"], ["c"]] ]); let fir = new first_follow_1.FirstCalculator(grammar); let automataTools = new lr1_1.LR1AutomataTools((sym) => fir.getFirstSet(sym)); let item = new definition_2.Item(S.prods[0], 0, new Set([definition_1.EOF])); it(`Left-Recursion-Look-Set of ${item}`, function () { let expection = new Set(["a", "b"]); let actuality = automataTools.determineLeftRecursionLookSet(item); for (let v of expection) actuality.should.have.key(v); }); it(`Non-Left-Recursion-Look-Set of ${item}`, function () { let expection = new Set([definition_1.EOF]); let actuality = automataTools.determineNonLeftRecursionLookSet(item); for (let v of expection) actuality.should.have.key(v); }); }); }); describe("============Calculation Of LR-Closure Test============", function () { describe(` 黄金 S->E E->E+F | E*F | F F->id `, function () { let S = new definition_1.NonTerminal("S"); let E = new definition_1.NonTerminal("E"); let F = new definition_1.NonTerminal("F"); let grammar = new toolkit_1.SimpleGrammar([ [S, [E]], [E, [E, "+", F], [E, "*", F], [F]], [F, ["id"]] ]); let fir = new first_follow_1.FirstCalculator(grammar); let automataTools = new lr1_1.LR1AutomataTools((sym) => fir.getFirstSet(sym)); let item = new definition_2.Item(S.prods[0], 0, new Set([definition_1.EOF])); let I0 = new definition_2.ItemSet(item); it(`LR-Closure of ${I0} should be: S->·E,{EOF} E->·E+F,{+,*,EOF} E->·E*F,{+,*,EOF} E->·F,{+,*,EOF} F->·id,{+,*,EOF} `, function () { let expection = new definition_2.ItemSet(item, new definition_2.Item(E.prods[0], 0, new Set(["+", "*", definition_1.EOF])), new definition_2.Item(E.prods[1], 0, new Set(["+", "*", definition_1.EOF])), new definition_2.Item(E.prods[2], 0, new Set(["+", "*", definition_1.EOF])), new definition_2.Item(F.prods[0], 0, new Set(["+", "*", definition_1.EOF]))); let actuality = automataTools.closure(I0); actuality.equals(expection).should.true(); }); }); }); //# sourceMappingURL=lr1-lookset.test.js.map