summary refs log tree commit diff
path: root/src/guile
diff options
context:
space:
mode:
authorLudovic Courtes2006-09-03 16:56:42 +0000
committerLudovic Courtes2006-09-03 16:56:42 +0000
commit7249dc962a9f31f1c8f3d72a3a55d2112514baff (patch)
treeb2ececdc4eb8cb434174247f342bb1c9e013e642 /src/guile
parent8008a4d20f277910d5524e7704db32068010a0a5 (diff)
downloadskribilo-7249dc962a9f31f1c8f3d72a3a55d2112514baff.tar.gz
skribilo-7249dc962a9f31f1c8f3d72a3a55d2112514baff.tar.lz
skribilo-7249dc962a9f31f1c8f3d72a3a55d2112514baff.zip
Added error conditions in `ast.scm'.
* src/guile/skribilo/ast.scm: Use `srfi-3[45]' and `condition' but not
  `lib'.
  (&ast-error): New.
  (&ast-orphan-error): New.
  (&ast-cycle-error): New.
  (&markup-unknown-option-error): New.
  (&markup-already-bound-error): New.
  (handle-ast-error): New.
  (markup-option): Use `raise' instead of `skribe-(type-)?error'.
  (markup-option-set!): Likewise.
  (markup-option-add!): Likewise.
  (markup-parent): Likewise.
  (document-bind-node!): Likewise.
  (find1-down): Likewise.

* src/guile/skribilo/resolve.scm (&resolution-error): Removed.
  (&resolution-orphan-error): Removed.  Moved as `&ast-orphan-error' in
  `ast.scm'.  Updated users.

git-archimport-id: lcourtes@laas.fr--2005-libre/skribilo--devo--1.2--patch-58
Diffstat (limited to 'src/guile')
-rw-r--r--src/guile/skribilo/ast.scm116
-rw-r--r--src/guile/skribilo/resolve.scm43
2 files changed, 107 insertions, 52 deletions
diff --git a/src/guile/skribilo/ast.scm b/src/guile/skribilo/ast.scm
index e17b2dd..542f629 100644
--- a/src/guile/skribilo/ast.scm
+++ b/src/guile/skribilo/ast.scm
@@ -22,10 +22,14 @@
 
 (define-module (skribilo ast)
   :use-module (oop goops)
+
+  :use-module (srfi srfi-34)
+  :use-module (srfi srfi-35)
+  :use-module (skribilo condition)
+  :use-module (skribilo utils syntax)
+
   :autoload (skribilo location) (location?)
-  :autoload (skribilo lib) (skribe-type-error skribe-error)
   :autoload (srfi srfi-1)  (fold)
-  :use-module (skribilo utils syntax)
   :export (<ast> ast? ast-loc ast-loc-set!
 		 ast-parent ast->string ast->file-location
 		 ast-resolved?
@@ -56,7 +60,19 @@
 	   ast-fold
            container-search-down search-down find-down find1-down
            find-up find1-up
-           ast-document ast-chapter ast-section))
+           ast-document ast-chapter ast-section
+
+	   ;; error conditions
+	   &ast-error &ast-orphan-error &ast-cycle-error
+	   &markup-unknown-option-error &markup-already-bound-error
+	   ast-orphan-error? ast-orphan-error:ast
+	   ast-cycle-error? ast-cycle-error:object
+	   markup-unknown-option-error?
+	   markup-unknown-option-error:markup
+	   markup-unknown-option-error:option
+	   markup-already-bound-error?
+	   markup-already-bound-error:markup
+	   markup-already-bound-error:ident))
 
 ;;; Author:  Erick Gallesio, Manuel Serrano, Ludovic Courtès
 ;;;
@@ -71,6 +87,74 @@
 (fluid-set! current-reader %skribilo-module-reader)
 
 
+
+;;;
+;;; Error conditions.
+;;;
+
+(define-condition-type &ast-error &skribilo-error
+  ast-error?)
+
+(define-condition-type &ast-orphan-error &ast-error
+  ast-orphan-error?
+  (ast ast-orphan-error:ast))
+
+(define-condition-type &ast-cycle-error &ast-error
+  ast-cycle-error?
+  (object ast-cycle-error:object))
+
+(define-condition-type &markup-unknown-option-error &ast-error
+  markup-unknown-option-error?
+  (markup markup-unknown-option-error:markup)
+  (option markup-unknown-option-error:option))
+
+(define-condition-type &markup-already-bound-error &ast-error
+  markup-already-bound-error?
+  (markup markup-already-bound-error:markup)
+  (ident  markup-already-bound-error:ident))
+
+
+(define (handle-ast-error c)
+  ;; Issue a user-friendly error message for error condition C.
+  (cond ((ast-orphan-error? c)
+	 (let* ((node (ast-orphan-error:ast c))
+		(location (and (ast? node) (ast-loc node))))
+	   (format (current-error-port) "orphan node: ~a~a~%"
+		   node
+		   (if (location? location)
+		       (string-append " "
+				      (location-file location) ":"
+				      (location-line location))
+		       ""))))
+
+	((ast-cycle-error? c)
+	 (let ((object (ast-cycle-error:object c)))
+	   (format (current-error-port)
+		   "cycle found in AST: ~a~%" object)))
+
+	((markup-unknown-option-error? c)
+	 (let ((markup (markup-unknown-option-error:markup c))
+	       (option (markup-unknown-option-error:option c)))
+	   (format (current-error-port)
+		   "~a: unknown markup option for `~a'~%"
+		   option markup)))
+
+	((markup-already-bound-error? c)
+	 (let ((markup (markup-already-bound-error:markup c))
+	       (ident  (markup-already-bound-error:ident  c)))
+	   (format (current-error-port)
+		   "`~a' (~a): markup identifier already bound~%"
+		   ident
+		   (if (markup? markup)
+		       (markup-markup markup)
+		       markup))))
+
+	(else
+	 (format (current-error-port) "undefined resolution error: ~a~%"
+		 c))))
+
+(register-error-condition-handler! ast-error? handle-ast-error)
+
 
 
 ;;;
@@ -217,22 +301,29 @@
       (let ((c (assq opt (slot-ref m 'options))))
 	(and (pair? c) (pair? (cdr c))
 	     (cadr c)))
-      (skribe-type-error 'markup-option "Illegal markup: " m "markup")))
+      (raise (condition (&invalid-argument-error
+			 (proc-name "markup-option")
+			 (argument  m))))))
 
 (define (markup-option-set! m opt val)
   (if (markup? m)
       (let ((c (assq opt (slot-ref m 'options))))
 	(if (and (pair? c) (pair? (cdr c)))
 	    (set-cdr! c (list val))
-	    (skribe-error 'markup-option-set! "unknown option: "
-			  m)))
-      (skribe-type-error 'markup-option-set! "Illegal markup: " m "markup")))
+	    (raise (condition (&markup-unknown-option-error
+			       (markup m)
+			       (option opt))))))
+      (raise (condition (&invalid-argument-error
+			 (proc-name "markup-option-set!")
+			 (argument  m))))))
 
 (define (markup-option-add! m opt val)
   (if (markup? m)
       (slot-set! m 'options (cons (list opt val)
 				  (slot-ref m 'options)))
-      (skribe-type-error 'markup-option "Illegal markup: " m "markup")))
+      (raise (condition (&invalid-argument-error
+			 (proc-name "markup-option-add!")
+			 (argument  m))))))
 
 
 (define (is-markup? obj markup)
@@ -243,7 +334,7 @@
 (define (markup-parent m)
   (let ((p (slot-ref m 'parent)))
     (if (eq? p 'unspecified)
-	(skribe-error 'markup-parent "Unresolved parent reference" m)
+	(raise (condition (&ast-orphan-error (ast m))))
 	p)))
 
 (define (markup-document m)
@@ -366,8 +457,9 @@
 	(let ((handle (hash-get-handle (document-node-table doc) ident)))
 	  ;;(format (current-error-port) "binding `~a' in `~a'~%" ident node)
 	  (if (and (pair? handle) (not (eq? (cdr handle) node)))
-	      (error "node identifier already bound"
-		     (cdr handle)) ;; FIXME: use `raise'
+	      (raise (condition (&markup-already-bound-error
+				 (ident  ident)
+				 (markup node))))
 	      (hash-set! (document-node-table doc) ident node))))))
 
 (define (document-bind-nodes! doc)
@@ -458,7 +550,7 @@
              (stack '()))
     (cond
      ((memq obj stack)
-      (skribe-error 'find1-down "Illegal cyclic object" obj))
+      (raise (condition (&ast-cycle-error (object obj)))))
      ((pair? obj)
       (let liip ((obj obj))
         (cond
diff --git a/src/guile/skribilo/resolve.scm b/src/guile/skribilo/resolve.scm
index c2e2c35..ba5af6a 100644
--- a/src/guile/skribilo/resolve.scm
+++ b/src/guile/skribilo/resolve.scm
@@ -33,48 +33,11 @@
 
   :export (resolve! resolve-search-parent resolve-children resolve-children*
 	   find1 resolve-counter resolve-parent resolve-ident
-	   *document-being-resolved*
-
-           &resolution-error resolution-error?
-           &resolution-orphan-error resolution-orphan-error?
-           resolution-orphan-error:ast))
+	   *document-being-resolved*))
 
 (fluid-set! current-reader %skribilo-module-reader)
 
 
-
-;;;
-;;; Error conditions.
-;;;
-
-(define-condition-type &resolution-error &skribilo-error
-  resolution-error?)
-
-(define-condition-type &resolution-orphan-error &resolution-error
-  resolution-orphan-error?
-  (ast resolution-orphan-error:ast))
-
-
-(define (handle-resolution-error c)
-  ;; Issue a user-friendly error message for error condition C.
-  (cond ((resolution-orphan-error? c)
-	 (let* ((node (resolution-orphan-error:ast c))
-		(location (and (ast? node) (ast-loc node))))
-	   (format (current-error-port) "orphan node: ~a~a~%"
-		   node
-		   (if (location? location)
-		       (string-append " "
-				      (location-file location) ":"
-				      (location-line location))
-		       ""))))
-
-	(else
-	 (format (current-error-port) "undefined resolution error: ~a~%"
-		 c))))
-
-(register-error-condition-handler! resolution-error?
-				   handle-resolution-error)
-
 
 
 ;;;
@@ -248,7 +211,7 @@
 	      (cadr c)
 	      n)))
        ((eq? (slot-ref n 'parent) 'unspecified)
-        (raise (condition (&resolution-orphan-error (ast n)))))
+        (raise (condition (&ast-orphan-error (ast n)))))
        (else
 	(slot-ref n 'parent)))))
 
@@ -281,7 +244,7 @@
   (let ((c (assq (symbol-append cnt '-counter) e)))
     (if (not (pair? c))
 	(if (or (null? opt) (not (car opt)) (null? e))
-            (raise (condition (&resolution-orphan-error (ast n))))
+            (raise (condition (&ast-orphan-error (ast n))))
 	    (begin
 	      (set-cdr! (last-pair e)
 			(list (list (symbol-append cnt '-counter) 0)