]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/wisi/wisi-parse.el
Merge commit '469cd3bc117bfb8da0c03a2a2fb185e80c81d068'
[gnu-emacs-elpa] / packages / wisi / wisi-parse.el
index bb3b60b43785b5499aa5e8d2c54518f8d0c1d10a..bd7ce7eec216b7383f8db455a4b0dee661451d80 100755 (executable)
@@ -1,6 +1,6 @@
 ;;; wisi-parse.el --- Wisi parser
 
-;; Copyright (C) 2013  Free Software Foundation, Inc.
+;; Copyright (C) 2013, 2014  Free Software Foundation, Inc.
 
 ;; This file is part of GNU Emacs.
 
@@ -26,8 +26,8 @@
 
 ;;; Code:
 
+(require 'cl-lib)
 (require 'semantic/wisent)
-(eval-when-compile (require 'cl-lib))
 
 (cl-defstruct (wisi-parser-state
            (:copier nil))
 If a file needs more than this, it's probably an indication that
 the grammar is excessively redundant.")
 
+(defvar wisi-parse-max-parallel-current (cons 0 0)
+  "Cons (count . point); Maximum number of parallel parsers used in most recent parse,
+point at which that max was spawned.")
+
 (defvar wisi-debug 0
   "wisi debug mode:
 0 : normal - ignore parse errors, for indenting new code
@@ -99,9 +103,6 @@ the grammar is excessively redundant.")
            :label 0
            :active  'shift
            :stack   (make-vector wisent-parse-max-stack-size nil)
-           ;; FIXME: better error message when stack overflows, so
-           ;; user can set wisent-parse-max-stack-size in file-local
-           ;; vars.
            :sp      0
            :pending nil)))
         (active-parser-count 1)
@@ -110,6 +111,8 @@ the grammar is excessively redundant.")
         (token (funcall lexer))
         some-pending)
 
+    (setq wisi-parse-max-parallel-current (cons 0 0))
+
     (aset (wisi-parser-state-stack (aref parser-states 0)) 0 0) ;; Initial state
 
     (while (not (eq active 'accept))
@@ -147,6 +150,8 @@ the grammar is excessively redundant.")
                         )))
                  )
                (setq active-parser-count (1+ active-parser-count))
+               (when (> active-parser-count (car wisi-parse-max-parallel-current))
+                 (setq wisi-parse-max-parallel-current (cons active-parser-count (point))))
                (setf (wisi-parser-state-label result) j)
                (aset parser-states j result))
              (when (> wisi-debug 1)
@@ -330,7 +335,16 @@ nil, 'shift, or 'accept."
 (defun wisi-execute-pending (pending)
   (while pending
     (when (> wisi-debug 1) (message "%s" (car pending)))
-    (apply (pop pending))))
+
+    (cond
+     ((and (>= emacs-major-version 24)
+          (>= emacs-minor-version 3))
+      (apply (pop pending)))
+
+     (t
+      (let ((func-args (pop pending)))
+       (apply (car func-args) (cdr func-args))))
+     )))
 
 (defun wisi-parse-1 (token parser-state pendingp actions gotos)
   "Perform one shift or reduce on PARSER-STATE.