@parser-generator/grammar-interpreter
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
54 lines (52 loc) • 2.12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const should_1 = __importDefault(require("should"));
const lexer_1 = require("../lexer");
const interp_1 = require("../../../interp");
const shim_1 = require("@light0x00/shim");
const core_1 = require("@parser-generator/core");
const definition_1 = require("@parser-generator/definition");
const fs_1 = __importDefault(require("fs"));
describe(`LR Arithmetic Parser Test`, function () {
it(`1+2-3*5/4=-0.75`, function () {
let { code } = interp_1.genParser(`
<% import { Expr } from "./ast"; %>
#TOKEN_PROTOTYPES
digit
#GRAMMAR
S->E;
E->E '+' E | E '-' E |E'*'E |E'/'E | '(' E ')' | digit <% (e)=>new Expr(e) %>;
#SYMBOL_ASSOC_PREC
'+' left 0
'-' left 0
'*' left 1
'/' left 1
`, { parser: "LR1", lang: "TS" });
fs_1.default.writeFileSync(__dirname + "/parser.tmp.ts", code, { encoding: "utf-8", flag: "w+" });
Promise.resolve().then(() => __importStar(require("./parser.tmp"))).then(({ parser, digit }) => {
shim_1.assert(parser instanceof core_1.LRParser);
shim_1.assert(digit instanceof definition_1.TokenPro);
it(`1+2-3*5/4`, function () {
let ast = parser.parse(lexer_1.getLexer("1+2-3*5/ 4", digit));
let r = ast.eval();
should_1.default(r).eql(-0.75);
});
it(`(1+2-3*4/5)+(6)-(7/8)`, function () {
let ast = parser.parse(lexer_1.getLexer("(1+2-3*4/5)+(6)-(7/8)", digit));
let r = ast.eval();
should_1.default(r).eql(5.725);
});
});
});
});
//# sourceMappingURL=index.test.js.map