Function: ebnf-factor
ebnf-factor is a byte-compiled function defined in ebnf-bnf.el.gz.
Signature
(ebnf-factor TOKEN)
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/ebnf-bnf.el.gz
;;; factor = [ "$" ] "\"" terminal "\"" ;; terminal
;;; | [ "$" ] non_terminal ;; non-terminal
;;; | [ "$" ] "?" special "?" ;; special
;;; | "(" body ")" ;; group
;;; | "[" body "]" ;; zero-or-one
;;; | "{" body [ "||" body ] "}+" ;; one-or-more
;;; | "{" body [ "||" body ] "}*" ;; zero-or-more
;;; | "{" body [ "||" body ] "}" ;; zero-or-more
;;; .
(defun ebnf-factor (token)
(cond
;; terminal
((eq token 'terminal)
(ebnf-make-terminal ebnf-bnf-lex))
;; non-terminal
((eq token 'non-terminal)
(ebnf-make-non-terminal ebnf-bnf-lex))
;; special
((eq token 'special)
(ebnf-make-special ebnf-bnf-lex))
;; group
((eq token 'begin-group)
(let ((body (ebnf-body)))
(or (eq (car body) 'end-group)
(error "Missing `)'"))
(cdr body)))
;; optional
((eq token 'begin-optional)
(let ((body (ebnf-body)))
(or (eq (car body) 'end-optional)
(error "Missing `]'"))
(ebnf-token-optional (cdr body))))
;; list
((eq token 'begin-list)
(let* ((body (ebnf-body))
(token (car body))
(list-part (cdr body))
sep-part)
(and (eq token 'list-separator)
;; { A || B }
(setq body (ebnf-body) ; get separator
token (car body)
sep-part (cdr body)))
(cond
;; { A }+
((eq token 'end-one-or-more)
(ebnf-make-one-or-more list-part sep-part))
;; { A }*
((eq token 'end-zero-or-more)
(ebnf-make-zero-or-more list-part sep-part))
(t
(error "Missing `}+', `}*' or `}'"))
)))
;; no term
(t
nil)
))