[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/peg e7aaa6c: * peg.el: Use lexical-binding and cl-lib.
From: |
Stefan Monnier |
Subject: |
[elpa] externals/peg e7aaa6c: * peg.el: Use lexical-binding and cl-lib. Fix copyright and header |
Date: |
Sun, 10 Mar 2019 18:13:46 -0400 (EDT) |
branch: externals/peg
commit e7aaa6c9eda3f62fda2280eb160b0fe0c35b8b6f
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>
* peg.el: Use lexical-binding and cl-lib. Fix copyright and header
Don't bother testing Emacs version.
(peg-translate-rules): Use letrec.
(peg-add-method): Add debug spec.
---
peg.el | 66 ++++++++++++++++++++++++++++++++++++++----------------------------
1 file changed, 38 insertions(+), 28 deletions(-)
diff --git a/peg.el b/peg.el
index 8867e82..2d3773f 100644
--- a/peg.el
+++ b/peg.el
@@ -1,8 +1,10 @@
-;;; peg.el --- Parsing Expression Grammars in Emacs Lisp
-;;
-;; Copyright 2008 Helmut Eller <address@hidden>.
+;;; peg.el --- Parsing Expression Grammars in Emacs Lisp -*-
lexical-binding:t -*-
+
+;; Copyright (C) 2008-2019 Free Software Foundation, Inc.
;;
-;; Version: 0.6 (2009-Nov-04)
+;; Author: Helmut Eller <address@hidden>
+;; Maintainer: Stefan Monnier <address@hidden>
+;; Version: 0.7
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -137,11 +139,10 @@
;; Roman Redziejowski does good PEG related research
;; http://www.romanredz.se/pubs.htm
-(unless (>= emacs-major-version 22)
- (error "peg.el requires Emacs version 22 or newer"))
-
;;; Code:
+(eval-when-compile (require 'cl-lib))
+
(defmacro peg-parse (&rest rules)
"Match RULES at point.
Return (T STACK) if the match succeed and nil on failure."
@@ -185,27 +186,31 @@ Note: a PE can't \"call\" rules by name."
(dolist (rule rules)
(puthash (car rule) (peg-normalize `(and . ,(cdr rule))) peg-rules))
(peg-check-cycles peg-rules)
- `(let ((peg-thunks '()) (peg-errors '(-1))
- . ,(mapcar #'car rules))
- ,@(mapcar (lambda (rule)
- (let ((name (car rule)))
- `(setq ,name
+ `(progn
+ (defvar peg-errors) (defvar peg-thunks)
+ (let ((peg-thunks '()) (peg-errors '(-1)))
+ (letrec
+ ,(mapcar (lambda (rule)
+ (let ((name (car rule)))
+ `(,name
(lambda ()
,(peg-translate-exp (gethash name peg-rules))))))
- rules)
- (cond ((funcall ,(car (car rules)))
- (peg-postprocess peg-thunks))
- (t
- (goto-char (car peg-errors))
- (error "Parse error at %d (expecting %S)"
- (car peg-errors)
- (peg-merge-errors (cdr peg-errors))))))))
+ rules)
+ (cond ((funcall ,(car (car rules)))
+ (peg-postprocess peg-thunks))
+ (t
+ (goto-char (car peg-errors))
+ (error "Parse error at %d (expecting %S)"
+ (car peg-errors)
+ (peg-merge-errors (cdr peg-errors))))))))))
(eval-and-compile
(defun peg-method-table-name (method-name)
(intern (format "peg-%s-methods" method-name))))
+;; FIXME: Replace peg-define-method-table/peg-add-method with cl-defgeneric and
+;; cl-defmethod?
(defmacro peg-define-method-table (name)
(let ((tab (peg-method-table-name name)))
`(progn
@@ -213,7 +218,8 @@ Note: a PE can't \"call\" rules by name."
(setq ,tab (make-hash-table :size 20)))))
(defmacro peg-add-method (method type args &rest body)
- (declare (indent 3))
+ (declare (indent 3)
+ (debug (symbolp symbolp sexp def-body)))
`(puthash ',type (lambda ,args . ,body) ,(peg-method-table-name method)))
(peg-define-method-table normalize)
@@ -371,7 +377,7 @@ Note: a PE can't \"call\" rules by name."
(insert-before-markers ,replacement))))
(stack-action (x --)))))
-(peg-add-method normalize quote (form)
+(peg-add-method normalize quote (_form)
(error "quote is reserved for future use"))
(peg-define-method-table translate)
@@ -381,6 +387,9 @@ Note: a PE can't \"call\" rules by name."
"Return the ELisp code to match the PE EXP."
(let ((translator (or (gethash (car exp) peg-translate-methods)
(error "No translator for: %S" (car exp)))))
+ ;; FIXME: This expansion basically duplicates `exp' in the output, which is
+ ;; a serious problem because it's done recursively, so it makes the output
+ ;; code's size exponentially larger than the input!
`(or ,(apply translator (cdr exp))
(progn
(peg-record-failure ',exp) ; for error reporting
@@ -544,12 +553,13 @@ Note: a PE can't \"call\" rules by name."
;; graph as long as we can without consuming input. When we find a
;; recursive call we signal an error.
-(defun peg-check-cycles (peg-rules)
- (maphash (lambda (name exp)
- (peg-detect-cycles exp (list name))
- (dolist (node (peg-find-star-nodes exp))
- (peg-detect-cycles node '())))
- peg-rules))
+(defun peg-check-cycles (rules)
+ (let ((peg-rules rules))
+ (maphash (lambda (name exp)
+ (peg-detect-cycles exp (list name))
+ (dolist (node (peg-find-star-nodes exp))
+ (peg-detect-cycles node '())))
+ rules)))
(defun peg-find-star-nodes (exp)
(let ((type (car exp)))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [elpa] externals/peg e7aaa6c: * peg.el: Use lexical-binding and cl-lib. Fix copyright and header,
Stefan Monnier <=