(peg-parse): Fix bug#78884

* lisp/progmodes/peg.el (peg-parse): Be more careful when
testing if a symbol is the name of an existing rule.  Improve docstring.

test/lisp/progmodes/peg-tests.el (peg-tests--peg-parse): New test.
This commit is contained in:
Stefan Monnier 2025-06-24 18:24:01 -04:00
parent 6c0bbf0f92
commit 68100ca656
2 changed files with 14 additions and 3 deletions

View file

@ -317,11 +317,15 @@ EXPS is a list of rules/expressions that failed.")
"Match PEXS at point.
PEXS is a sequence of PEG expressions, implicitly combined with `and'.
Returns STACK if the match succeed and signals an error on failure,
moving point along the way."
moving point along the way.
For backward compatibility (and convenience) PEXS can also be a list of
RULES in which case we run the first such rule. In case of ambiguity,
prefix PEXS with \"\" so it doesn't look like a list of rules."
(if (and (consp (car pexs))
(symbolp (caar pexs))
(not (ignore-errors
(not (eq 'call (car (peg-normalize (car pexs))))))))
(not (or (get (peg--rule-id (caar pexs)) 'peg--rule-definition)
(ignore-errors
(not (eq 'call (car (peg-normalize (car pexs)))))))))
;; The first of `pexs' has not been defined as a rule, so assume
;; that none of them have been and they should be fed to
;; `with-peg-rules'

View file

@ -396,5 +396,12 @@ resp. succeeded instead of signaling an error."
;; (peg-ex-last-digit2 (make-string 500000 ?-))
;; (peg-ex-last-digit2 (make-string 500000 ?5))
(ert-deftest peg-tests--peg-parse ()
(with-temp-buffer
(insert "abc")
(goto-char (point-min))
(peg-parse (bob) "ab")
(should (looking-at "c"))))
(provide 'peg-tests)
;;; peg-tests.el ends here