diff --git a/CHANGELOG.md b/CHANGELOG.md index 14577e6d..5a5d99b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,9 +14,11 @@ Released: TBD ### Bug Fixes -- [#371](https://github.com/peggyjs/peggy/issues/371) Error using online Peggy - Can't find variable: util +- [#371](https://github.com/peggyjs/peggy/issues/371) Error using online Peggy - "Can't find variable: util". From @hildjj. - [#374](https://github.com/peggyjs/peggy/issues/374) CLI throws exception on grammar errors. From @hildjj +- [#381](https://github.com/peggyjs/peggy/issues/381) Repetitions with code blocks + for min or max not handling non-integer returns correctly. From @hildjj. 3.0.1 ----- diff --git a/lib/compiler/passes/generate-js.js b/lib/compiler/passes/generate-js.js index f0f2c91f..ac1a0307 100644 --- a/lib/compiler/passes/generate-js.js +++ b/lib/compiler/passes/generate-js.js @@ -488,11 +488,11 @@ function generateJS(ast, options) { break; case op.IF_LT_DYNAMIC: // IF_LT_DYNAMIC min, t, f - compileCondition(stack.top() + ".length < " + stack.index(bc[ip + 1]) + "|0", 1); + compileCondition(stack.top() + ".length < (" + stack.index(bc[ip + 1]) + "|0)", 1); break; case op.IF_GE_DYNAMIC: // IF_GE_DYNAMIC max, t, f - compileCondition(stack.top() + ".length >= " + stack.index(bc[ip + 1]) + "|0", 1); + compileCondition(stack.top() + ".length >= (" + stack.index(bc[ip + 1]) + "|0)", 1); break; case op.WHILE_NOT_ERROR: // WHILE_NOT_ERROR b diff --git a/test/behavior/generated-parser-behavior.spec.js b/test/behavior/generated-parser-behavior.spec.js index dacacc2d..c9f413b8 100644 --- a/test/behavior/generated-parser-behavior.spec.js +++ b/test/behavior/generated-parser-behavior.spec.js @@ -1512,6 +1512,40 @@ describe("generated parser behavior", () => { expect(parser).to.parse("abb", ["a", ["b", "b"]]); }); }); + + // Regression tests for https://github.com/peggyjs/peggy/issues/381 + it("with functions returning non-integers", () => { + // Like |0| + let parser = peg.generate("start = 'a'|{ return 'a' }|", options); + expect(parser).to.parse("", []); + expect(parser).to.failToParse("aaa", { + expected: [{ type: "end" }], + }); + + // Like |0..2| + parser = peg.generate("start = 'a'|{ return 'a' }..2|", options); + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("aa", ["a", "a"]); + expect(parser).to.failToParse("aaa", { + expected: [{ type: "end" }], + }); + + // Like |..0| + parser = peg.generate("start = 'a'|..{ return 'a' }|", options); + expect(parser).to.parse("", []); + expect(parser).to.failToParse("a", { + expected: [{ type: "end" }], + }); + + // Like |1..2| + parser = peg.generate("start = 'a'|{return '1.8e0' }..{ return 2.8 }|", options); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("aa", ["a", "a"]); + expect(parser).to.failToParse("aaa", { + expected: [{ type: "end" }], + }); + }); }); describe("with delimiter", () => {