diff options
| author | Stefan Monnier | 2025-09-27 18:20:37 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2025-09-27 18:20:37 -0400 |
| commit | 021b7065bb734ca5e880f2fb74ddd48ffed4185a (patch) | |
| tree | fc83ec62477ad267456ca9949b3604bac185de75 | |
| parent | 4e7cb37b8440bf63ce5ef715282bfbf9b263128a (diff) | |
| download | emacs-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.el | 22 |
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) |