UNPKG

@parser-generator/grammar-interpreter

Version:

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

54 lines (52 loc) 2.11 kB
"use strict"; 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=test.js.map