]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/ebnf-iso.el
Romain Francoise's and Ami Fischman's bugfixes.
[gnu-emacs] / lisp / progmodes / ebnf-iso.el
index e5bf10dcb0fb604b3fe670e946553540f1d7fdda..9329f90af5efe59895c37e9955d82c98cef8469b 100644 (file)
@@ -1,12 +1,12 @@
-;;; ebnf-iso --- Parser for ISO EBNF
+;;; ebnf-iso.el --- parser for ISO EBNF
 
-;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
-;; Author:     Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br>
 ;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br>
-;; Keywords:   wp, ebnf, PostScript
-;; Time-stamp: <99/11/20 18:04:11 vinicius>
-;; Version:    1.4
+;; Keywords: wp, ebnf, PostScript
+;; Time-stamp: <2003/08/12 21:29:14 vinicius>
+;; Version: 1.6
 
 ;; This file is part of GNU Emacs.
 
 ;;
 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;; code:
+;;; Code:
 
 
 (require 'ebnf-otz)
   "Value returned by `ebnf-iso-lex' function.")
 
 
-(defconst ebnf-no-meta-identifier nil)
+(defvar ebnf-no-meta-identifier nil
+  "Used by `ebnf-iso-term' and `ebnf-iso-lex' functions.")
 
 \f
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Syntatic analyzer
+;; Syntactic analyzer
 
 
 ;;; ISO EBNF = syntax rule, {syntax rule};
     (goto-char start)
     (setq token (ebnf-iso-lex))
     (and (eq token 'end-of-input)
-        (error "Invalid ISO EBNF file format."))
+        (error "Invalid ISO EBNF file format"))
     (while (not (eq token 'end-of-input))
       (ebnf-message-float
        "Parsing...%s%%"
        body)
     (setq ebnf-action nil)
     (or (eq token 'non-terminal)
-       (error "Invalid meta identifier syntax rule."))
+       (error "Invalid meta identifier syntax rule"))
     (or (eq (ebnf-iso-lex) 'equal)
-       (error "Invalid syntax rule: missing `='."))
+       (error "Invalid syntax rule: missing `='"))
     (setq body (ebnf-iso-definition-list))
     (or (eq (car body) 'period)
-       (error "Invalid syntax rule: missing `;' or `.'."))
+       (error "Invalid syntax rule: missing `;' or `.'"))
     (setq body (cdr body))
     (ebnf-eps-add-production header)
     (cons (ebnf-iso-lex)
   (if (eq token 'integer)
       (let ((times ebnf-iso-lex))
        (or (eq (ebnf-iso-lex) 'repeat)
-           (error "Missing `*'."))
+           (error "Missing `*'"))
        (ebnf-token-repeat times (ebnf-iso-primary (ebnf-iso-lex))))
     (ebnf-iso-primary token)))
 
          ((eq token 'begin-group)
           (let ((body (ebnf-iso-definition-list)))
             (or (eq (car body) 'end-group)
-                (error "Missing `)'."))
+                (error "Missing `)'"))
             (cdr body)))
          ;; optional sequence
          ((eq token 'begin-optional)
           (let ((body (ebnf-iso-definition-list)))
             (or (eq (car body) 'end-optional)
-                (error "Missing `]' or `/)'."))
+                (error "Missing `]' or `/)'"))
             (ebnf-token-optional (cdr body))))
          ;; repeated sequence
          ((eq token 'begin-zero-or-more)
           (let* ((body   (ebnf-iso-definition-list))
                  (repeat (cdr body)))
             (or (eq (car body) 'end-zero-or-more)
-                (error "Missing `}' or `:)'."))
+                (error "Missing `}' or `:)'"))
             (ebnf-make-zero-or-more repeat)))
          ;; empty
          (t
     (aset ebnf-iso-token-table ?.  'character)))
 
 
+;; replace the range "\240-\377" (see `ebnf-range-regexp').
+(defconst ebnf-iso-non-terminal-chars
+  (ebnf-range-regexp " 0-9A-Za-z" ?\240 ?\377))
+
+
 (defun ebnf-iso-lex ()
   "Lexical analyser for ISO EBNF.
 
@@ -426,7 +432,7 @@ See documentation for variable `ebnf-iso-lex'."
        'end-of-input)
        ;; error
        ((eq token 'error)
-       (error "Illegal character."))
+       (error "Illegal character"))
        ;; integer
        ((eq token 'integer)
        (setq ebnf-iso-lex (ebnf-buffer-substring "0-9"))
@@ -447,11 +453,12 @@ See documentation for variable `ebnf-iso-lex'."
        'terminal)
        ;; non-terminal
        ((eq token 'non-terminal)
-       (setq ebnf-iso-lex (ebnf-iso-normalize
-                           (ebnf-trim-right
-                            (ebnf-buffer-substring " 0-9A-Za-z\240-\377"))))
+       (setq ebnf-iso-lex
+             (ebnf-iso-normalize
+              (ebnf-trim-right
+               (ebnf-buffer-substring ebnf-iso-non-terminal-chars))))
        (and ebnf-no-meta-identifier
-            (error "Exception sequence should not contain a meta identifier."))
+            (error "Exception sequence should not contain a meta identifier"))
        'non-terminal)
        ;; begin optional, begin list or begin group
        ((eq token 'left-parenthesis)
@@ -489,7 +496,9 @@ See documentation for variable `ebnf-iso-lex'."
        ))))
 
 
-(defconst ebnf-iso-comment-chars "^*(\000-\010\016-\037\177-\237")
+;; replace the range "\177-\237" (see `ebnf-range-regexp').
+(defconst ebnf-iso-comment-chars
+  (ebnf-range-regexp "^*(\000-\010\016-\037" ?\177 ?\237))
 
 
 (defun ebnf-iso-skip-comment ()
@@ -509,7 +518,7 @@ See documentation for variable `ebnf-iso-lex'."
     (while (> pair 0)
       (skip-chars-forward ebnf-iso-comment-chars ebnf-limit)
       (cond ((>= (point) ebnf-limit)
-            (error "Missing end of comment: `*)'."))
+            (error "Missing end of comment: `*)'"))
            ((= (following-char) ?*)
             (skip-chars-forward "*" ebnf-limit)
             (when (= (following-char) ?\))
@@ -523,7 +532,7 @@ See documentation for variable `ebnf-iso-lex'."
               (forward-char)
               (setq pair (1+ pair))))
            (t
-            (error "Illegal character."))
+            (error "Illegal character"))
            ))))
 
 
@@ -604,4 +613,5 @@ See documentation for variable `ebnf-iso-lex'."
 (provide 'ebnf-iso)
 
 
+;;; arch-tag: 03315eef-8f64-404a-bf9d-256d42442ee3
 ;;; ebnf-iso.el ends here