Function: wisent-parse-stream
wisent-parse-stream is a byte-compiled function defined in
wisent.el.gz.
Signature
(wisent-parse-stream STREAM GOAL)
Documentation
Parse STREAM using the Wisent LALR parser.
GOAL is a nonterminal symbol to start parsing at.
Return the list (STREAM SEMANTIC-STREAM) where STREAM are those
elements of STREAM that have not been used. SEMANTIC-STREAM is the
list of semantic tags found.
The LALR parser automaton must be available in buffer local variable
semantic--parse-table.
Must be installed by semantic-install-function-overrides to override
the standard function semantic-parse-stream.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/semantic/wisent.el.gz
;; Parser plug-ins
;;
;; The following functions permit plugging the Wisent LALR parser in
;; Semantic toolkit. They use the standard API provided by Semantic
;; to plug parsers in.
;;
;; Two plug-ins are available, BUT ONLY ONE MUST BE USED AT A TIME:
;;
;; - `wisent-parse-stream' designed to override the standard function
;; `semantic-parse-stream'.
;;
;; - `wisent-parse-region' designed to override the standard function
;; `semantic-parse-region'.
;;
;; Maybe the latter is faster because it eliminates a lot of function
;; call.
;;
(defun wisent-parse-stream (stream goal)
"Parse STREAM using the Wisent LALR parser.
GOAL is a nonterminal symbol to start parsing at.
Return the list (STREAM SEMANTIC-STREAM) where STREAM are those
elements of STREAM that have not been used. SEMANTIC-STREAM is the
list of semantic tags found.
The LALR parser automaton must be available in buffer local variable
`semantic--parse-table'.
Must be installed by `semantic-install-function-overrides' to override
the standard function `semantic-parse-stream'."
(let (wisent-lex-istream wisent-lex-lookahead la-elt cache)
;; IMPLEMENTATION NOTES:
;; `wisent-parse' returns a lookahead token when it stopped
;; parsing before encountering the end of input. To re-enter the
;; parser it is necessary to push back in the lexical input stream
;; the last lookahead token issued. Because the format of
;; lookahead tokens and tokens in STREAM can be different the
;; lookahead token is put in the variable `wisent-lex-lookahead'
;; before calling `wisent-parse'. Wisent's lexers always pop the
;; next lexical token from that variable when non-nil, then from
;; the lexical input stream.
;;
;; The first element of STREAM is used to keep lookahead tokens
;; across successive calls to `wisent-parse-stream'. In fact
;; what is kept is a stack of lookaheads encountered so far. It
;; is cleared when `wisent-parse' returns a valid semantic tag,
;; or twice the same lookahead token! The latter indicates that
;; there is a syntax error on that token. If so, tokens currently
;; in the lookahead stack have not been used, and are moved into
;; `semantic-unmatched-syntax-cache'. When the parser will be
;; re-entered, a new lexical token will be read from STREAM.
;;
;; The first element of STREAM that contains the lookahead stack
;; has this format (compatible with the format of `semantic-lex'
;; tokens):
;;
;; (LOOKAHEAD-STACK START . END)
;;
;; where LOOKAHEAD-STACK is a list of lookahead tokens. And
;; START/END are the bounds of the lookahead at top of stack.
;; Retrieve lookahead token from stack
(setq la-elt (car stream))
(if (consp (car la-elt))
;; The first elt of STREAM contains a lookahead stack
(setq wisent-lex-lookahead (caar la-elt)
stream (cdr stream))
(setq la-elt nil))
;; Parse
(setq wisent-lex-istream stream
cache (semantic-safe "wisent-parse-stream: %s"
(condition-case error-to-filter
(wisent-parse semantic--parse-table
wisent-lexer-function
wisent-error-function
goal)
(args-out-of-range
(if (and (not debug-on-error)
(= wisent-parse-max-stack-size
(nth 2 error-to-filter)))
(progn
(message "wisent-parse-stream: %s"
(error-message-string error-to-filter))
(message "wisent-parse-max-stack-size \
might need to be increased"))
(apply #'signal error-to-filter))))))
;; Manage returned lookahead token
(if wisent-lookahead
(if (eq (caar la-elt) wisent-lookahead)
;; It is already at top of lookahead stack
(progn
(setq cache nil
la-elt (car la-elt))
(while la-elt
;; Collect unmatched tokens from the stack
(run-hook-with-args
'wisent-discarding-token-functions (car la-elt))
(setq la-elt (cdr la-elt))))
;; New lookahead token
(if (or (consp cache) ;; Clear the stack if parse succeeded
(null la-elt))
(setq la-elt (cons nil nil)))
;; Push it into the stack
(setcar la-elt (cons wisent-lookahead (car la-elt)))
;; Update START/END
(setcdr la-elt (cddr wisent-lookahead))
;; Push (LOOKAHEAD-STACK START . END) in STREAM
(setq wisent-lex-istream (cons la-elt wisent-lex-istream))))
;; Return (STREAM SEMANTIC-STREAM)
(list wisent-lex-istream
(if (consp cache) cache '(nil))
)))