1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-08 00:33:13 -08:00

peg.el: Fix bug#79502

* lisp/progmodes/peg.el (peg--merge-error): Provide a default method.
(peg--merge-error) <call>: Handle calls with arguments.
(peg--merge-error) <any, not>: Remove methods, now redundant with the
default method.
(peg--merge-error) <guard>: Delegate to the default method if we can't
do better.
This commit is contained in:
Stefan Monnier 2025-09-27 18:20:37 -04:00
parent 4e7cb37b84
commit 021b7065bb

View file

@ -897,8 +897,8 @@ input. PATH is the list of rules that we have visited so far."
(defun peg-merge-error (exp merged)
(apply #'peg--merge-error merged exp))
(cl-defgeneric peg--merge-error (_merged head &rest args)
(error "No merge-error method for: %S" (cons head args)))
(cl-defgeneric peg--merge-error (merged head &rest args)
(cl-adjoin (cons head args) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql or)) e1 e2)
(peg-merge-error e2 (peg-merge-error e1 merged)))
@ -911,36 +911,24 @@ input. PATH is the list of rules that we have visited so far."
;;(add-to-list 'merged str)
(cl-adjoin str merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql call)) rule)
;; (add-to-list 'merged rule)
(cl-adjoin rule merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql call)) rule &rest args)
(cl-adjoin (if args (cons rule args) rule) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql char)) char)
;; (add-to-list 'merged (string char))
(cl-adjoin (string char) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql set)) r c k)
;; (add-to-list 'merged (peg-make-charset-regexp r c k))
(cl-adjoin (peg-make-charset-regexp r c k) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql range)) from to)
;; (add-to-list 'merged (format "[%c-%c]" from to))
(cl-adjoin (format "[%c-%c]" from to) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql *)) exp)
(peg-merge-error exp merged))
(cl-defmethod peg--merge-error (merged (_ (eql any)))
;; (add-to-list 'merged '(any))
(cl-adjoin '(any) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql not)) x)
;; (add-to-list 'merged `(not ,x))
(cl-adjoin `(not ,x) merged :test #'equal))
(cl-defmethod peg--merge-error (merged (_ (eql action)) _action) merged)
(cl-defmethod peg--merge-error (merged (_ (eql guard)) e)
(if (eq e t) merged (cl-adjoin `(guard ,e) merged :test #'equal)))
(if (eq e t) merged (cl-call-next-method)))
(provide 'peg)
(require 'peg)