@parser-generator/core
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
70 lines • 3.07 kB
JavaScript
;
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