diff --git a/src/core/peg.c b/src/core/peg.c index d8ab0265..41c0ef19 100644 --- a/src/core/peg.c +++ b/src/core/peg.c @@ -211,6 +211,7 @@ tail: } case RULE_SET: { + if (text >= s->text_end) return NULL; uint32_t word = rule[1 + (text[0] >> 5)]; uint32_t mask = (uint32_t)1 << (text[0] & 0x1F); return (text < s->text_end && (word & mask)) diff --git a/test/suite0013.janet b/test/suite0013.janet index 1fd0bbdb..164e2cbb 100644 --- a/test/suite0013.janet +++ b/test/suite0013.janet @@ -27,4 +27,15 @@ (assert (deep= (tabseq [i :in (range 3)] i) @{})) +(def- sym-prefix-peg + (peg/compile + ~{:symchar (+ (range "\x80\xff" "AZ" "az" "09") (set "!$%&*+-./:@^_")) + :anchor (drop (cmt ($) ,|(= $ 0))) + :cap (* (+ (> -1 (not :symchar)) :anchor) (* ($) '(some :symchar))) + :recur (+ :cap (> -1 :recur)) + :main (> -1 :recur)})) + +(assert (deep= (peg/match sym-prefix-peg @"123" 3) @[0 "123"]) "peg lookback") +(assert (deep= (peg/match sym-prefix-peg @"1234" 4) @[0 "1234"]) "peg lookback 2") + (end-suite)