blob: beb8d330a35b177bf353dab21f915a4ab8045529 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
;;; 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
|