aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2025-09-27 18:20:37 -0400
committerStefan Monnier2025-09-27 18:20:37 -0400
commit021b7065bb734ca5e880f2fb74ddd48ffed4185a (patch)
treefc83ec62477ad267456ca9949b3604bac185de75
parent4e7cb37b8440bf63ce5ef715282bfbf9b263128a (diff)
downloademacs-021b7065bb734ca5e880f2fb74ddd48ffed4185a.tar.gz
emacs-021b7065bb734ca5e880f2fb74ddd48ffed4185a.zip
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.
-rw-r--r--lisp/progmodes/peg.el22
1 files changed, 5 insertions, 17 deletions
diff --git a/lisp/progmodes/peg.el b/lisp/progmodes/peg.el
index 4518d82cc37..15372555ab5 100644
--- a/lisp/progmodes/peg.el
+++ b/lisp/progmodes/peg.el
@@ -897,8 +897,8 @@ input. PATH is the list of rules that we have visited so far."
897(defun peg-merge-error (exp merged) 897(defun peg-merge-error (exp merged)
898 (apply #'peg--merge-error merged exp)) 898 (apply #'peg--merge-error merged exp))
899 899
900(cl-defgeneric peg--merge-error (_merged head &rest args) 900(cl-defgeneric peg--merge-error (merged head &rest args)
901 (error "No merge-error method for: %S" (cons head args))) 901 (cl-adjoin (cons head args) merged :test #'equal))
902 902
903(cl-defmethod peg--merge-error (merged (_ (eql or)) e1 e2) 903(cl-defmethod peg--merge-error (merged (_ (eql or)) e1 e2)
904 (peg-merge-error e2 (peg-merge-error e1 merged))) 904 (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."
911 ;;(add-to-list 'merged str) 911 ;;(add-to-list 'merged str)
912 (cl-adjoin str merged :test #'equal)) 912 (cl-adjoin str merged :test #'equal))
913 913
914(cl-defmethod peg--merge-error (merged (_ (eql call)) rule) 914(cl-defmethod peg--merge-error (merged (_ (eql call)) rule &rest args)
915 ;; (add-to-list 'merged rule) 915 (cl-adjoin (if args (cons rule args) rule) merged :test #'equal))
916 (cl-adjoin rule merged :test #'equal))
917 916
918(cl-defmethod peg--merge-error (merged (_ (eql char)) char) 917(cl-defmethod peg--merge-error (merged (_ (eql char)) char)
919 ;; (add-to-list 'merged (string char))
920 (cl-adjoin (string char) merged :test #'equal)) 918 (cl-adjoin (string char) merged :test #'equal))
921 919
922(cl-defmethod peg--merge-error (merged (_ (eql set)) r c k) 920(cl-defmethod peg--merge-error (merged (_ (eql set)) r c k)
923 ;; (add-to-list 'merged (peg-make-charset-regexp r c k))
924 (cl-adjoin (peg-make-charset-regexp r c k) merged :test #'equal)) 921 (cl-adjoin (peg-make-charset-regexp r c k) merged :test #'equal))
925 922
926(cl-defmethod peg--merge-error (merged (_ (eql range)) from to) 923(cl-defmethod peg--merge-error (merged (_ (eql range)) from to)
927 ;; (add-to-list 'merged (format "[%c-%c]" from to))
928 (cl-adjoin (format "[%c-%c]" from to) merged :test #'equal)) 924 (cl-adjoin (format "[%c-%c]" from to) merged :test #'equal))
929 925
930(cl-defmethod peg--merge-error (merged (_ (eql *)) exp) 926(cl-defmethod peg--merge-error (merged (_ (eql *)) exp)
931 (peg-merge-error exp merged)) 927 (peg-merge-error exp merged))
932 928
933(cl-defmethod peg--merge-error (merged (_ (eql any)))
934 ;; (add-to-list 'merged '(any))
935 (cl-adjoin '(any) merged :test #'equal))
936
937(cl-defmethod peg--merge-error (merged (_ (eql not)) x)
938 ;; (add-to-list 'merged `(not ,x))
939 (cl-adjoin `(not ,x) merged :test #'equal))
940
941(cl-defmethod peg--merge-error (merged (_ (eql action)) _action) merged) 929(cl-defmethod peg--merge-error (merged (_ (eql action)) _action) merged)
942(cl-defmethod peg--merge-error (merged (_ (eql guard)) e) 930(cl-defmethod peg--merge-error (merged (_ (eql guard)) e)
943 (if (eq e t) merged (cl-adjoin `(guard ,e) merged :test #'equal))) 931 (if (eq e t) merged (cl-call-next-method)))
944 932
945(provide 'peg) 933(provide 'peg)
946(require 'peg) 934(require 'peg)