change the option setup: everyone has an option contract now and

the module lexer either exercises or not, depending on its level of trust
This commit is contained in:
Robby Findler 2013-02-23 16:25:55 -06:00
parent 64d7911fe5
commit 5e2cc344c8
3 changed files with 33 additions and 42 deletions

View File

@ -1,8 +1,11 @@
#lang racket/base #lang racket/base
(require racket/port (require racket/port
"racket-lexer.rkt" "racket-lexer.rkt"
racket/contract) "lexer-contract.rkt"
(provide module-lexer) racket/contract
unstable/options)
(provide
(contract-out [module-lexer lexer/c]))
#| #|
@ -23,31 +26,6 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
|# |#
(define lexer/c
(or/c (->i ([in input-port?])
(values [txt any/c]
[type symbol?]
[paren (or/c symbol? #f)]
[start (or/c exact-positive-integer? #f)]
[end (start)
(if start
(and/c exact-positive-integer?
(>=/c start))
#f)]))
(->i ([in input-port?]
[offset exact-nonnegative-integer?]
[mode any/c])
(values [txt any/c]
[type symbol?]
[paren (or/c symbol? #f)]
[start (or/c exact-positive-integer? #f)]
[end (start)
(if start
(and/c exact-positive-integer?
(>=/c start))
#f)]
[backup exact-nonnegative-integer?]
[new-mode any/c]))))
(define (module-lexer in offset mode) (define (module-lexer in offset mode)
(cond (cond
@ -91,16 +69,12 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
(for ([i (in-range (file-position in) (file-position p))]) (for ([i (in-range (file-position in) (file-position p))])
(read-byte-or-special in)) (read-byte-or-special in))
(define no-ctc-lexer (or (get-info 'color-lexer #f) (define the-lexer (or (get-info 'color-lexer #f) racket-lexer))
racket-lexer)) (when (has-option? the-lexer)
;; add the lexer contract (set! the-lexer
(define the-lexer (contract lexer/c (if (trusted-lexer? the-lexer)
no-ctc-lexer (waive-option the-lexer)
lang-name (exercise-option the-lexer))))
'syntax-color/module-lexer
(or (object-name no-ctc-lexer)
(format "~a's lexer" lang-name))
#'here))
;; Produce language as first token: ;; Produce language as first token:
(values (values
@ -144,3 +118,12 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
(define (set-port-next-location-from src dest) (define (set-port-next-location-from src dest)
(define-values (line col pos) (port-next-location src)) (define-values (line col pos) (port-next-location src))
(set-port-next-location! dest line col pos)) (set-port-next-location! dest line col pos))
(define (trusted-lexer? the-lexer)
(member (object-name the-lexer)
'(racket-lexer
racket-lexer/status
racket-nobar-lexer/status
scribble-inside-lexer
scribble-lexer)))

View File

@ -1,11 +1,15 @@
#lang racket/base #lang racket/base
(require parser-tools/lex (require parser-tools/lex
racket/contract
"lexer-contract.rkt"
(prefix-in : parser-tools/lex-sre)) (prefix-in : parser-tools/lex-sre))
(provide racket-lexer (provide
racket-lexer/status (contract-out
racket-nobar-lexer/status) [racket-lexer lexer/c]
[racket-lexer/status lexer/c]
[racket-nobar-lexer/status lexer/c]))
(define-lex-abbrevs (define-lex-abbrevs

View File

@ -1,9 +1,13 @@
#lang scheme/base #lang scheme/base
(require "scheme-lexer.rkt" (require "scheme-lexer.rkt"
racket/contract
"lexer-contract.rkt"
racket/port) racket/port)
(provide scribble-inside-lexer (provide
scribble-lexer) (contract-out
[scribble-inside-lexer lexer/c]
[scribble-lexer lexer/c]))
(define-struct text (scheme-rx end-rx sub-rx string-rx open-paren close-paren) #:transparent) (define-struct text (scheme-rx end-rx sub-rx string-rx open-paren close-paren) #:transparent)
(define-struct scheme (status backup) #:transparent) (define-struct scheme (status backup) #:transparent)