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)
       ))))