Skip to content

Instantly share code, notes, and snippets.

@dyoo
Created January 9, 2013 19:12
Show Gist options
  • Save dyoo/4495946 to your computer and use it in GitHub Desktop.
Save dyoo/4495946 to your computer and use it in GitHub Desktop.
ozzloy's example
#! /usr/bin/env racket
#lang racket/base
(require parser-tools/yacc
parser-tools/lex
(prefix-in : parser-tools/lex-sre))
(define-empty-tokens empty-tokens-group
(EOF
TRUE
OPEN-OBJECT))
(define json-lexer
(lexer-src-pos
[(eof) (token-EOF)]
["{" (token-OPEN-OBJECT)]
["true" (token-TRUE)]))
(define (lex-json json)
(define input
(cond [(string? json) (open-input-string json)]
[(input-port? json) json]
[else (error "lex-json accepts input-ports or strings")]))
(port-count-lines! input)
(lambda () (json-lexer input)))
(require syntax/readerr)
(define json-parser
(parser
(src-pos)
(start start)
(end EOF)
(error (lambda (tok-ok? tok-name tok-value start-pos end-pos)
(raise-read-error "~a is not valid at top level"
"???"
(position-line start-pos)
(position-col start-pos)
(position-offset start-pos)
(and (number? (position-offset start-pos))
(number? (position-offset end-pos))
(- (position-offset end-pos) (position-offset start-pos))))))
(tokens empty-tokens-group)
(grammar
[start
[(object) `(JSON ,$1)]]
[object
[(OPEN-OBJECT value) `(OBJECT ,$2)]]
[value
[(TRUE) '(TRUE)]])))
(define (parse-json json)
(json-parser (lex-json json)))
(require rackunit)
(define ((single-srcloc-fail position) e)
(and (exn:fail:read? e)
(let ([srclocs (exn:fail:read-srclocs e)])
(and
(equal? (length srclocs) 1)
(equal? (srcloc-position (list-ref srclocs 0)) position)))))
(check-exn (single-srcloc-fail 1) (lambda () (parse-json "true"))
"true is not valid at top level")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment