#lang scheme/base

;; We use the position struct from the parser-tools collection in order to
;; interoperate with the DrScheme syntax coloring mechanism, but we use our
;; own custom token structure since the syntax colorer doesn't make use of
;; the parser-tools token structure.

(require (only-in parser-tools/lex
                  position struct:position make-position position?
                  position-offset position-line position-col
                  set-position-offset! set-position-line! set-position-col!))
(provide (all-defined-out)
         (struct-out position))

(define-struct region (source start end)
  #:property prop:custom-write (lambda (r port write?)
                                 (fprintf port
                                          (position-line (region-start r))
                                          (position-col (region-start r))
                                          (position-line (region-end r))
                                          (position-col (region-end r)))))

;; region->string : region -> string
(define (region->string r)
  (format "~a:~a:~a-~a:~a"
          (object-name (region-source r))
          (position-line (region-start r))
          (position-col (region-start r))
          (position-line (region-end r))
          (position-col (region-end r))))

;; string * boolean * boolean
(define-struct regexp-contents (pattern global? case-insensitive?)

;; symbol * (optional (union string number symbol regexp-contents)) * region
(define-struct token (type contents location)