Function: ebnf-abn-repetition
ebnf-abn-repetition is a byte-compiled function defined in
ebnf-abn.el.gz.
Signature
(ebnf-abn-repetition TOKEN)
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/ebnf-abn.el.gz
;;; repetition = [repeat] element
;;;
;;; repeat = 1*DIGIT / (*DIGIT "*" *DIGIT)
(defun ebnf-abn-repetition (token)
(let (lower upper)
;; INTEGER [ "*" [ INTEGER ] ]
(when (eq token 'integer)
(setq lower ebnf-abn-lex
token (ebnf-abn-lex))
(or (eq token 'repeat)
(setq upper lower)))
;; "*" [ INTEGER ]
(when (eq token 'repeat)
;; only * ==> lower & upper are empty string
(or lower
(setq lower ""
upper ""))
(when (eq (setq token (ebnf-abn-lex)) 'integer)
(setq upper ebnf-abn-lex
token (ebnf-abn-lex))))
(let ((element (ebnf-abn-element token)))
(cond
;; there is a repetition
(lower
(or element
(error "Missing element repetition"))
(setq token (ebnf-abn-lex))
(cond
;; one or more
((and (string= lower "1") (null upper))
(cons token (ebnf-make-one-or-more element)))
;; zero or more
((or (and (string= lower "0") (null upper))
(and (string= lower "") (string= upper "")))
(cons token (ebnf-make-zero-or-more element)))
;; real repetition
(t
(ebnf-token-repeat lower (cons token element) upper))))
;; there is an element
(element
(cons (ebnf-abn-lex) element))
;; something that caller has to deal
(t
(cons token nil))))))