Function: ebnf-dtd-lex
ebnf-dtd-lex is a byte-compiled function defined in ebnf-dtd.el.gz.
Signature
(ebnf-dtd-lex)
Documentation
Lexical analyzer for DTD.
Return a lexical token.
See documentation for variable ebnf-dtd-lex(var)/ebnf-dtd-lex(fun).
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/ebnf-dtd.el.gz
(defun ebnf-dtd-lex ()
"Lexical analyzer for DTD.
Return a lexical token.
See documentation for variable `ebnf-dtd-lex'."
(if (>= (point) ebnf-limit)
'end-of-input
(let (token)
;; skip spaces and comments
(while (if (> (following-char) 255)
(progn
(setq token 'error)
nil)
(setq token (aref ebnf-dtd-token-table (following-char)))
(cond
((eq token 'space)
(skip-chars-forward " \n\r\t" ebnf-limit)
(< (point) ebnf-limit))
((and (eq token 'less-than)
(looking-at "<!--"))
(ebnf-dtd-skip-comment))
(t nil)
)))
(cond
;; end of input
((>= (point) ebnf-limit)
'end-of-input)
;; error
((eq token 'error)
(error "Invalid character"))
;; beginning of declaration:
;; <?name, <!ATTLIST, <!DOCTYPE, <!ELEMENT, <!ENTITY, <!NOTATION
((eq token 'less-than)
(forward-char)
(let ((char (following-char)))
(cond ((= char ?\?) ; <?
(forward-char)
(setq ebnf-dtd-lex (ebnf-buffer-substring ebnf-dtd-name-chars))
'begin-pi)
((= char ?!) ; <!
(forward-char)
(let ((decl (ebnf-buffer-substring ebnf-dtd-name-chars)))
(or (cdr (assoc decl ebnf-dtd-decl-alist))
(error "Invalid declaration name `%s'" decl))))
(t ; <x
(error "Invalid declaration `<%c'" char)))))
;; name, namechar
((memq token '(name name-char))
(setq ebnf-dtd-lex (ebnf-buffer-substring ebnf-dtd-name-chars))
(or (cdr (assoc ebnf-dtd-lex ebnf-dtd-name-alist))
token))
;; ?, ?>
((eq token 'interrogation)
(forward-char)
(if (/= (following-char) ?>)
'optional
(forward-char)
'end-pi))
;; #FIXED, #IMPLIED, #PCDATA, #REQUIRED
((eq token 'hash)
(forward-char)
(setq ebnf-dtd-lex
(concat "#" (ebnf-buffer-substring ebnf-dtd-name-chars)))
(or (cdr (assoc ebnf-dtd-lex ebnf-dtd-element-alist))
(error "Invalid element `%s'" ebnf-dtd-lex)))
;; "string"
((eq token 'double-quote)
(setq ebnf-dtd-lex (ebnf-dtd-string ?\"))
'string)
;; 'string'
((eq token 'single-quote)
(setq ebnf-dtd-lex (ebnf-dtd-string ?\'))
'string)
;; %, %name;
((eq token 'percent)
(forward-char)
(if (looking-at "[ \n\r\t]")
'percent
(setq ebnf-dtd-lex (ebnf-dtd-name-ref "%"))
'pe-ref))
;; &#...;, &#x...;, &name;
((eq token 'ampersand)
(forward-char)
(if (/= (following-char) ?#)
(progn
;; &name;
(setq ebnf-dtd-lex (ebnf-dtd-name-ref "&"))
'entity-ref)
;; &#...;, &#x...;
(forward-char)
(setq ebnf-dtd-lex (if (/= (following-char) ?x)
(ebnf-dtd-char-ref "&#" "0-9")
(forward-char)
(ebnf-dtd-char-ref "&#x" "[:xdigit:]")))
'char-ref))
;; miscellaneous: (, ), [, ], =, |, *, +, >, `,'
(t
(forward-char)
token)
))))