You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
2.8 KiB
Racket
59 lines
2.8 KiB
Racket
#lang s-exp syntax/module-reader
|
|
brag/codegen/expander
|
|
#:read my-read
|
|
#:read-syntax my-read-syntax
|
|
#:info my-get-info
|
|
#:whole-body-readers? #t
|
|
|
|
(require brag/rules/parser
|
|
brag/rules/lexer
|
|
brag/rules/stx
|
|
brag/rules/rule-structs)
|
|
|
|
(define (my-read in)
|
|
(syntax->datum (my-read-syntax #f in)))
|
|
|
|
(define (my-read-syntax src in)
|
|
(define-values (first-line first-column first-position) (port-next-location in))
|
|
(define tokenizer (tokenize in))
|
|
(define rules
|
|
(parameterize ([current-parser-error-handler
|
|
(lambda (tok-ok? tok-name tok-value start-pos end-pos)
|
|
(raise-syntax-error
|
|
#f
|
|
(format "Error while parsing grammar near: ~a [line=~a, column=~a, position=~a]"
|
|
tok-value
|
|
(pos-line start-pos)
|
|
(pos-col start-pos)
|
|
(pos-offset start-pos))
|
|
(datum->syntax #f
|
|
(string->symbol (format "~a" tok-value))
|
|
(list src
|
|
(pos-line start-pos)
|
|
(pos-col start-pos)
|
|
(pos-offset start-pos)
|
|
(if (and (number? (pos-offset end-pos))
|
|
(number? (pos-offset start-pos)))
|
|
(- (pos-offset end-pos)
|
|
(pos-offset start-pos))
|
|
#f)))))])
|
|
(grammar-parser tokenizer)))
|
|
(define-values (last-line last-column last-position) (port-next-location in))
|
|
(rules->stx src rules
|
|
#:original-stx (datum->syntax #f 'original-stx
|
|
(list src
|
|
first-line
|
|
first-column
|
|
first-position
|
|
(if (and (number? last-position)
|
|
(number? first-position))
|
|
(- last-position first-position)
|
|
#f)))))
|
|
|
|
(define (my-get-info key default default-filter)
|
|
(case key
|
|
[(color-lexer) (dynamic-require 'brag/private/colorer 'color-brag (λ () #f))]
|
|
[(drracket:indentation) (dynamic-require 'brag/private/indenter 'indent-brag (λ () #f))]
|
|
[else (default-filter key default)]))
|
|
|