1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00
emacs/lisp/mim-syntax.el
1992-07-22 04:22:30 +00:00

96 lines
3.1 KiB
EmacsLisp

;;; mim-syntax.el --- syntax checker for Mim (MDL).
;; Copyright (C) 1985 Free Software Foundation, Inc.
;; Author: K. Shane Hartman
;; Maintainer: FSF
;; Keywords: languages
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;;; Code:
(require 'mim-mode)
(defun slow-syntax-check-mim ()
"Check Mim syntax slowly.
Points out the context of the error, if the syntax is incorrect."
(interactive)
(message "checking syntax...")
(let ((stop (point-max)) point-stack current last-bracket whoops last-point)
(save-excursion
(goto-char (point-min))
(while (and (not whoops)
(re-search-forward "\\s(\\|\\s)\\|\"\\|[\\]" stop t))
(setq current (preceding-char))
(cond ((= current ?\")
(condition-case nil
(progn (re-search-forward "[^\\]\"")
(setq current nil))
(error (setq whoops (point)))))
((= current ?\\)
(condition-case nil (forward-char 1) (error nil)))
((= (char-syntax current) ?\))
(if (or (not last-bracket)
(not (= (logand (lsh (aref (syntax-table) last-bracket) -8)
?\177)
current)))
(setq whoops (point))
(setq last-point (car point-stack))
(setq last-bracket (if last-point (char-after (1- last-point))))
(setq point-stack (cdr point-stack))))
(t
(if last-point (setq point-stack (cons last-point point-stack)))
(setq last-point (point))
(setq last-bracket current)))))
(cond ((not (or whoops last-point))
(message "Syntax correct"))
(whoops
(goto-char whoops)
(cond ((equal current ?\")
(error "Unterminated string"))
((not last-point)
(error "Extraneous %s" (char-to-string current)))
(t
(error "Mismatched %s with %s"
(save-excursion
(setq whoops (1- (point)))
(goto-char (1- last-point))
(buffer-substring (point)
(min (progn (end-of-line) (point))
whoops)))
(char-to-string current)))))
(t
(goto-char last-point)
(error "Unmatched %s" (char-to-string last-bracket))))))
(defun fast-syntax-check-mim ()
"Checks Mim syntax quickly.
Answers correct or incorrect, cannot point out the error context."
(interactive)
(save-excursion
(goto-char (point-min))
(let (state)
(while (and (not (eobp))
(equal (car (setq state (parse-partial-sexp (point) (point-max) 0)))
0)))
(if (equal (car state) 0)
(message "Syntax correct")
(error "Syntax incorrect")))))
;;; mim-syntax.el ends here