@parser-generator/grammar-interpreter
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
51 lines (50 loc) • 2.04 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 definition_1 = require("@parser-generator/definition");
const fs_1 = __importDefault(require("fs"));
const core_1 = require("@parser-generator/core");
describe(`LL Arithmetic Parser Test`, () => {
let parser, digit;
it(`fuck`, async () => {
let { code } = interp_1.genParser(`
<% import { Expr,Term, Factor } from "./ast"; %>
#TOKEN_PROTOTYPES
digit
#GRAMMAR
E->F T <% (e)=>new Expr(e) %>;
T-> "+"F T| '-'F T | NIL <% (e)=>new Term(e) %>;
F->digit | '('E')' <% (e)=>new Factor(e)%>;
`, { parser: "LL", lang: "TS" });
fs_1.default.writeFileSync(__dirname + "/parser.tmp.ts", code, { encoding: "utf-8", flag: "w+" });
let exp = await Promise.resolve().then(() => __importStar(require("./parser.tmp")));
parser = exp.parser;
digit = exp.digit;
shim_1.assert(parser instanceof core_1.LLParser);
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/a 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