emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] scratch/last-cedet-merge f11e08f 10/37: semantic: Fix wise


From: David Engster
Subject: [Emacs-diffs] scratch/last-cedet-merge f11e08f 10/37: semantic: Fix wisent parser recursion
Date: Sun, 22 Jan 2017 21:26:31 +0000 (UTC)

branch: scratch/last-cedet-merge
commit f11e08ff7208a8e71962c1cdc569d63fa0b09211
Author: Martin Stein <address@hidden>
Commit: David Engster <address@hidden>

    semantic: Fix wisent parser recursion
    
    * lisp/cedet/semantic/wisent/wisent.el (wisent-parse): The semantic
     action might be an EXPAND, EXPANDFULL or some similar action calling
     the parser recursively. If the last token of the recursively called
     parsing step failed to match it ends up in wisent-lookahead, and
     function wisent-parse-stream pushs it back onto
     wisent-lex-istream. From there on it simply ends up occuring twice on
     the unmatched-syntax-cache, or worse might even lead to parse errors
     in rare cases.
    
    Copyright-paperwork-exempt: yes
---
 lisp/cedet/semantic/wisent/wisent.el |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lisp/cedet/semantic/wisent/wisent.el 
b/lisp/cedet/semantic/wisent/wisent.el
index 36dff01..1958294 100644
--- a/lisp/cedet/semantic/wisent/wisent.el
+++ b/lisp/cedet/semantic/wisent/wisent.el
@@ -377,7 +377,7 @@ automaton has only one entry point."
          (wisent-parse-lexer-function lexer)
          (wisent-recovering nil)
          (wisent-input (wisent-parse-start start starts))
-         state tokid choices choice)
+         state tokid choices choice wisent-lookahead-save)
     (setq wisent-nerrs     0 ;; Reset parse error counter
           wisent-lookahead nil) ;; and lookahead token
     (aset stack 0 0) ;; Initial state
@@ -469,7 +469,12 @@ automaton has only one entry point."
        ;; Reduce by rule (call semantic action)
        ;; -------------------------------------
        (t
+        ;; save the global variable wisent-lookahead,
+        ;; as the semantic action might be an expand or expandfull
+        ;; which calls this function recursively
+        (setq wisent-lookahead-save wisent-lookahead)
         (setq sp (funcall wisent-loop stack sp gotos))
+        (setq wisent-lookahead wisent-lookahead-save)
         (or wisent-input (setq wisent-input (wisent-lexer))))))
     (run-hooks 'wisent-post-parse-hook)
     (car (aref stack 1))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]