git.fiddlerwoaroof.com
Raw Blame History
;;; These routines are strictly for debugging the parser.  They could
;;; be removed from the system later.

;;; define some debugging stuff
;;;  Here's the debugging control:
;;;  Capabilities:
;;;      record start (line,token,production,k)
;;;      record end (line,token,prodection,k)
;;;      print end (line,token,prodection,k,value)
;;;      break start
;;;      break end

(define *parser-debug-options* '())
(define *parser-debug-lines* '())
(define *parser-debug-id* 0)

(define (watch-lines . lines)
  (setf *parser-debug-lines* lines))

(define (watching-this-line?)
 (and (not (eq? *parser-debug-lines* 'none))
  (or (null? *parser-debug-lines*)
      (and (>= *current-line* (car *parser-debug-lines*))
	   (or (null? (cdr *parser-debug-lines*))
	       (<= *current-line* (cadr *parser-debug-lines*)))))))

(define (ptrace-print-obj x)
  (pprint x))

(define (ptrace-breakpoint)
  (error "Breakpoint~%"))

(define (parser-show-context id tag msg)
  (format '#t "~A parse of ~A(~A)  Line: ~A  Token: ~A"
	  msg tag id *current-line* *token*)
  (when (not (null? *token-args*))
     (format '#t " ~A" *token-args*))
  (format '#t "~%"))

(define (ptrace-clear)
  (setf *parser-debug-options* '()))

(define (ptrace-pop)
  (pop *parser-debug-options*))

(define (ptrace-watch . things)
  (dolist (x things)
     (push (cons x 'watch) *parser-debug-options*)))

(define (ptrace-show . things)
  (dolist (x things)
     (push (cons x 'show) *parser-debug-options*)))

(define (ptrace-break . things)
  (dolist (x things)
     (push (cons x 'break) *parser-debug-options*)))

;;; Routines called by the trace-parser macro

(define (tracing-parse/entry tag)
  (let ((all? (assq 'all *parser-debug-options*))
	(this? (assq tag *parser-debug-options*)))
    (cond ((or all? this?)
	   (incf *parser-debug-id*)
	   (parser-show-context *parser-debug-id* tag "Entering")
	   (when (and this? (eq? (cdr this?) 'break))
		 (ptrace-breakpoint))
	   *parser-debug-id*)
	  (else 0))))

(define (tracing-parse/exit tag id res)
  (let ((all? (assq 'all *parser-debug-options*))
	(this? (assq tag *parser-debug-options*)))
    (when (and (or all? this?) (not (eq? tag 0)))
      (setf (dynamic *returned-obj*) res)
      (parser-show-context id tag "Exiting")
      (when (and this? (eq? (cdr this?) 'show))
	    (ptrace-print-obj res))
      (when (and this? (eq? (cdr this?) 'break))
	    (ptrace-breakpoint)))))