126 lines
3.4 KiB
Scheme
126 lines
3.4 KiB
Scheme
;; Location ::= Nat | Symbol
|
|
;; Source ::= (make-source Location Location)
|
|
(define-record-type source :source
|
|
(make-source start stop)
|
|
source?
|
|
(start really-source-start)
|
|
(stop really-source-stop))
|
|
|
|
(define (source-start obj)
|
|
(cond ((element? obj) (element-start obj))
|
|
((attribute? obj) (attribute-start obj))
|
|
((pcdata? obj) (pcdata-start obj))
|
|
((entity? obj) (entity-start obj))
|
|
((pi? obj) (pi-start obj))
|
|
((start-tag? obj) (start-tag-start obj))
|
|
((end-tag? obj) (end-tag-start obj))
|
|
(else (really-source-start obj))))
|
|
|
|
(define (source-stop obj)
|
|
(cond ((element? obj) (element-stop obj))
|
|
((attribute? obj) (attribute-stop obj))
|
|
((pcdata? obj) (pcdata-stop obj))
|
|
((entity? obj) (entity-stop obj))
|
|
((pi? obj) (pi-stop obj))
|
|
((start-tag? obj) (start-tag-stop obj))
|
|
((end-tag? obj) (end-tag-stop obj))
|
|
(else (really-source-stop obj))))
|
|
|
|
;; Document ::= (make-document Prolog Element (listof Misc))
|
|
(define-record-type document :document
|
|
(make-document prolog element misc)
|
|
document?
|
|
(prolog document-prolog)
|
|
(element document-element)
|
|
(misc document-misc))
|
|
|
|
;; Prolog ::= (make-prolog (listof Misc) #f)
|
|
(define-record-type prolog :prolog
|
|
(make-prolog misc dtd)
|
|
prolog?
|
|
(misc prolog-misc)
|
|
(dtd prolog-dtd))
|
|
|
|
;; Element ::= (make-element Location Location Symbol (listof Attribute) (listof Content))
|
|
(define-record-type element :element
|
|
(make-element start stop name attributes content)
|
|
element?
|
|
(start element-start)
|
|
(stop element-stop)
|
|
(name element-name)
|
|
(attributes element-attributes)
|
|
(content element-content))
|
|
|
|
;; Attribute ::= (make-attribute Location Location Symbol String)
|
|
(define-record-type attribute :attribute
|
|
(make-attribute start stop name value)
|
|
attribute?
|
|
(start attribute-start)
|
|
(stop attribute-stop)
|
|
(name attribute-name)
|
|
(value attribute-value))
|
|
|
|
;; Pcdata ::= (make-pcdata Location Location String)
|
|
(define-record-type pcdata :pcdata
|
|
(make-pcdata start stop string)
|
|
pcdata?
|
|
(start pcdata-start)
|
|
(stop pcdata-stop)
|
|
(string pcdata-string))
|
|
|
|
;; Content ::= Pcdata
|
|
;; | Element
|
|
;; | Entity
|
|
;; | Misc
|
|
|
|
;; Misc ::= Comment
|
|
;; | Processing-instruction
|
|
|
|
;; Entity ::= (make-entity Location Location (U Nat Symbol))
|
|
(define-record-type entity :entity
|
|
(make-entity start stop text)
|
|
entity?
|
|
(start entity-start)
|
|
(stop entity-stop)
|
|
(text entity-text))
|
|
|
|
;; Processing-instruction ::= (make-pi Location Location String (list String))
|
|
;; also represents XMLDecl
|
|
(define-record-type pi :pi
|
|
(make-pi start stop target-name instruction)
|
|
pi?
|
|
(start pi-start)
|
|
(stop pi-stop)
|
|
(target-name pi-target-name)
|
|
(instruction pi-instruction))
|
|
|
|
;; Comment ::= (make-comment String)
|
|
(define-record-type comment :comment
|
|
(make-comment text)
|
|
comment?
|
|
(text comment-text))
|
|
|
|
;; content? : TST -> Bool
|
|
(define (content? x)
|
|
(or (pcdata? x) (element? x) (entity? x) (comment? x) (pi? x)))
|
|
|
|
|
|
;;; moved here from reader as it inherits from source
|
|
;; Start-tag ::= (make-start-tag Location Location Symbol (listof Attribute))
|
|
(define-record-type start-tag :start-tag
|
|
(make-start-tag start stop name attrs)
|
|
start-tag?
|
|
(start start-tag-start)
|
|
(stop start-tag-stop)
|
|
(name start-tag-name)
|
|
(attrs start-tag-attrs))
|
|
|
|
|
|
;; End-tag ::= (make-end-tag Location Location Symbol)
|
|
(define-record-type end-tag :end-tag
|
|
(make-end-tag start stop name)
|
|
end-tag?
|
|
(start end-tag-start)
|
|
(stop end-tag-stop)
|
|
(name end-tag-name))
|