Mercurial > emacs
diff lisp/=mim-syntax.el @ 35:63b375f17a65
Initial revision
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Tue, 31 Oct 1989 15:59:53 +0000 |
parents | |
children | 505130d1ddf8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/=mim-syntax.el Tue Oct 31 15:59:53 1989 +0000 @@ -0,0 +1,91 @@ +;; Syntax checker for Mim (MDL). +;; Copyright (C) 1985 Free Software Foundation, Inc. +;; Principal author K. Shane Hartman + +;; 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 1, 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. + + +(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"))))) + + +