Function: bovine-grammar-expand-form
bovine-grammar-expand-form is a byte-compiled function defined in
grammar.el.gz.
Signature
(bovine-grammar-expand-form FORM QUOTEMODE &optional INPLACE)
Documentation
Expand FORM into a new one suitable to the bovine parser.
FORM is a list in which we are substituting. Argument QUOTEMODE is non-nil if we are in backquote mode. When non-nil, optional argument INPLACE indicates that FORM is being expanded from elsewhere.
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/semantic/bovine/grammar.el.gz
(defun bovine-grammar-expand-form (form quotemode &optional inplace)
"Expand FORM into a new one suitable to the bovine parser.
FORM is a list in which we are substituting.
Argument QUOTEMODE is non-nil if we are in backquote mode.
When non-nil, optional argument INPLACE indicates that FORM is being
expanded from elsewhere."
(when (eq (car form) 'quote)
(setq form (cdr form))
(cond
((and (= (length form) 1) (listp (car form)))
(insert "\n(append")
(bovine-grammar-expand-form (car form) quotemode nil)
(insert ")")
(setq form nil inplace nil)
)
((and (= (length form) 1) (symbolp (car form)))
(insert "\n'" (symbol-name (car form)))
(setq form nil inplace nil)
)
(t
(insert "\n(list")
(setq inplace t)
)))
(let ((macro (assq (car form) bovine--grammar-macros))
inlist first n q x)
(if macro
(bovine-grammar-expand-form
(apply (cdr macro) (cdr form))
quotemode t)
(if inplace (insert "\n("))
(while form
(setq first (car form)
form (cdr form))
;; Hack for dealing with new reading of unquotes outside of
;; backquote (introduced in 2010-12-06T16:37:26Z!monnier@iro.umontreal.ca).
(when (and (listp first)
(or (equal (car first) '\,)
(equal (car first) '\,@)))
(if (listp (cadr first))
(setq form (append (cdr first) form)
first (car first))
(setq first (intern (concat (symbol-name (car first))
(symbol-name (cadr first)))))))
(cond
((eq first nil)
(when (and (not inlist) (not inplace))
(insert "\n(list")
(setq inlist t))
(insert " nil")
)
((listp first)
;;(let ((fn (and (symbolp (caar form)) (fboundp (caar form)))))
(when (and (not inlist) (not inplace))
(insert "\n(list")
(setq inlist t))
;;(if (and inplace (not fn) (not (eq (caar form) 'EXPAND)))
;; (insert " (append"))
(bovine-grammar-expand-form
first quotemode t) ;;(and fn (not (eq fn 'quote))))
;;(if (and inplace (not fn) (not (eq (caar form) 'EXPAND)))
;; (insert ")"))
;;)
)
((symbolp first)
(setq n (symbol-name first) ;the name
q quotemode ;implied quote flag
x nil) ;expand flag
(if (eq (aref n 0) ?,)
(if quotemode
;; backquote mode needs the @
(if (eq (aref n 1) ?@)
(setq n (substring n 2)
q nil
x t)
;; non backquote mode behaves normally.
(setq n (substring n 1)
q nil))
(setq n (substring n 1)
x t)))
(if (string= n "")
(progn
;; We expand only the next item in place (a list?)
;; A regular inline-list...
(bovine-grammar-expand-form (car form) quotemode t)
(setq form (cdr form)))
(if (and (eq (aref n 0) ?$)
;; Don't expand $ tokens in implied quote mode.
;; This acts like quoting in other symbols.
(not q))
(progn
(cond
((and (not x) (not inlist) (not inplace))
(insert "\n(list"))
((and x inlist (not inplace))
(insert ")")
(setq inlist nil)))
(insert "\n(nth " (int-to-string
(1- (string-to-number
(substring n 1))))
" vals)")
(and (not x) (not inplace)
(setq inlist t)))
(when (and (not inlist) (not inplace))
(insert "\n(list")
(setq inlist t))
(or (char-equal (char-before) ?\()
(insert " "))
(insert (if (or inplace (eq first t))
"" "'")
n))) ;; " "
)
(t
(when (and (not inlist) (not inplace))
(insert "\n(list")
(setq inlist t))
(insert (format "\n%S" first))
)
))
(if inlist (insert ")"))
(if inplace (insert ")")))
))