parse transformers

This commit is contained in:
jon 2010-04-21 18:15:58 -06:00 committed by Jon Rafkind
parent e052c33998
commit 72f83d19a9
5 changed files with 72 additions and 9 deletions

View File

@ -1,14 +1,24 @@
#lang scheme/base #lang scheme/base
(require scheme/class)
(require "private/honu-typed-scheme.ss" (require "private/honu-typed-scheme.ss"
;; "private/honu.ss" ;; "private/honu.ss"
"private/parse.ss" "private/parse.ss"
"private/literals.ss" "private/literals.ss"
"private/macro.ss") "private/macro.ss")
(define test-x-class
(class object%
(init-field tuna)
(super-new)))
(define x (new test-x-class [tuna 5]))
(provide (rename-out (#%dynamic-honu-module-begin #%module-begin) (provide (rename-out (#%dynamic-honu-module-begin #%module-begin)
(honu-top #%top) (honu-top #%top)
(semicolon \;) (semicolon \;
)
(honu-+ +) (honu-+ +)
(honu-* *) (honu-* *)
(honu-/ /) (honu-/ /)
@ -16,8 +26,11 @@
(honu-? ?) (honu-? ?)
(honu-: :) (honu-: :)
(honu-comma |,|) (honu-comma |,|)
(honu-. |.|)
) )
#%datum #%datum
#%braces
x
true true
false false
display display
@ -26,6 +39,9 @@
else else
(rename-out (rename-out
(honu-if if) (honu-if if)
(honu-provide provide)
(honu-macro-item macroItem)
(honu-macro macro)
)) ))
#; #;

View File

@ -320,6 +320,23 @@ Then, in the pattern above for 'if', 'then' would be bound to the following synt
|# |#
(define-honu-syntax honu-provide
(lambda (stx ctx)
(syntax-parse stx
#:literals (semicolon)
[(_ something:id semicolon . rest)
(values #'(provide something)
#'rest)])))
(define-honu-syntax honu-macro-item
(lambda (stx ctx)
(syntax-parse stx
#:literals (#%braces)
[(_ name:id (#%braces literals (#%braces literal ...)
items ...) . rest)
(values #'(define-syntax-class name [pattern x])
#'rest)])))
(define-honu-syntax honu-if (define-honu-syntax honu-if
(lambda (stx ctx) (lambda (stx ctx)
(define (parse-complete-block stx) (define (parse-complete-block stx)

View File

@ -16,5 +16,4 @@
honu-= honu-+= honu--= honu-*= honu-/= honu-%= honu-= honu-+= honu--= honu-*= honu-/= honu-%=
honu-&= honu-^= honu-\|= honu-<<= honu->>= honu->>>= honu-&= honu-^= honu-\|= honu-<<= honu->>= honu->>>=
honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->= honu->> honu-<< honu->>> honu-< honu-> honu-<= honu->=
honu-? honu-: honu-comma) honu-? honu-: honu-comma honu-. #%braces)

View File

@ -1,6 +1,6 @@
#lang scheme/base #lang scheme/base
(require "honu.ss" (require "honu-typed-scheme.ss"
(for-syntax "debug.ss" (for-syntax "debug.ss"
"contexts.ss" "contexts.ss"
scheme/base scheme/base
@ -364,6 +364,7 @@
(define-honu-syntax honu-macro (define-honu-syntax honu-macro
(lambda (stx ctx) (lambda (stx ctx)
(printf "Executing honu macro\n")
(syntax-case stx (#%parens #%braces) (syntax-case stx (#%parens #%braces)
[(_ (#%parens honu-literal ...) [(_ (#%parens honu-literal ...)
(#%braces (#%braces name pattern ...)) (#%braces (#%braces name pattern ...))
@ -422,7 +423,9 @@
out (... ...) rrest) out (... ...) rrest)
#; #;
#'rrest))]))) #'rrest))])))
#'rest))]))) #'rest))]
[else (raise-syntax-error 'honu-macro "fail!")]
)))
;; (my-syntax guz (_ display (#%parens x ...)) (+ x ...)) ;; (my-syntax guz (_ display (#%parens x ...)) (+ x ...))
;; (guz display (#%parens 1 2 3 4)) ;; (guz display (#%parens 1 2 3 4))

View File

@ -2,9 +2,11 @@
(require "contexts.ss" (require "contexts.ss"
"util.ss" "util.ss"
(for-template "literals.ss") (for-template "literals.ss"
"language.ss")
syntax/parse syntax/parse
syntax/parse/experimental/splicing syntax/parse/experimental/splicing
(for-syntax syntax/parse)
scheme/splicing scheme/splicing
syntax/stx syntax/stx
(for-syntax "util.ss") (for-syntax "util.ss")
@ -14,7 +16,8 @@
(define-syntax-class block (define-syntax-class block
[pattern (#%braces statement ...) [pattern (#%braces statement ...)
#:with result (parse-block-one/2 #'(statement ...) the-block-context)]) #:with result (let-values ([(body rest) (parse-block-one/2 #'(statement ...) the-block-context)])
body)])
(define-syntax-class function (define-syntax-class function
[pattern (type:id name:id (#%parens args ...) body:block . rest) [pattern (type:id name:id (#%parens args ...) body:block . rest)
@ -33,6 +36,21 @@
;; [(equal? start end) count] ;; [(equal? start end) count]
[else (loop (stx-cdr start) (add1 count))])))) [else (loop (stx-cdr start) (add1 count))]))))
(define-primitive-splicing-syntax-class (honu-transformer context)
#:attrs (result)
#:description "honu-expr"
(lambda (stx fail)
(cond
[(stx-null? stx) (fail)]
[(get-transformer stx) => (lambda (transformer)
(printf "Transforming honu macro ~a\n" (car stx))
(let-values ([(used rest)
(transformer stx context)])
(list rest (syntax-object-position stx rest)
used)))]
[else (fail)])))
(define-primitive-splicing-syntax-class (honu-expr context) (define-primitive-splicing-syntax-class (honu-expr context)
#:attributes (result) #:attributes (result)
#:description "honu-expr" #:description "honu-expr"
@ -40,6 +58,7 @@
(cond (cond
[(stx-null? stx) (fail)] [(stx-null? stx) (fail)]
[(get-transformer stx) => (lambda (transformer) [(get-transformer stx) => (lambda (transformer)
(printf "Transforming honu macro ~a\n" (car stx))
(let-values ([(used rest) (let-values ([(used rest)
(transformer stx context)]) (transformer stx context)])
(list (syntax-object-position stx rest) (list (syntax-object-position stx rest)
@ -59,8 +78,12 @@
#:with call #'(e.result arg.result ...)]) #:with call #'(e.result arg.result ...)])
(define-splicing-syntax-class (expression-last context) (define-splicing-syntax-class (expression-last context)
[pattern (~seq (~var e (honu-transformer context))) #:with result #'e.result]
[pattern (~seq (~var call (call context))) #:with result #'call.call] [pattern (~seq (~var call (call context))) #:with result #'call.call]
[pattern (~seq x:number) #:with result #'x] [pattern (~seq x:number) #:with result #'x]
[pattern (~seq x:id) #:with result #'x]
#;
[pattern (~seq (~var e (honu-expr context))) #:with result #'e.result] [pattern (~seq (~var e (honu-expr context))) #:with result #'e.result]
) )
@ -79,6 +102,8 @@
[else [else
#'left.result]))))) #'left.result])))))
;; (infix-operators ([honu-* ...] ;; (infix-operators ([honu-* ...]
;; [honu-- ...]) ;; [honu-- ...])
;; ([honu-+ ...] ;; ([honu-+ ...]
@ -98,7 +123,8 @@
(syntax-case stx () (syntax-case stx ()
[(_ first last operator-stuff ...) [(_ first last operator-stuff ...)
(with-syntax ([(name ...) (generate-temporaries #'(operator-stuff ...))]) (with-syntax ([(name ...) (generate-temporaries #'(operator-stuff ...))])
(with-syntax ([(result ...) (create-stuff (cons #'first (with-syntax ([(result ...)
(create-stuff (cons #'first
(append (append
(drop-last (syntax->list #'(name ...))) (drop-last (syntax->list #'(name ...)))
(list #'last))) (list #'last)))
@ -136,7 +162,9 @@
[honu-- (sl (left right) #'(- left right))]) [honu-- (sl (left right) #'(- left right))])
([honu-* (sl (left right) #'(* left right))] ([honu-* (sl (left right) #'(* left right))]
[honu-% (sl (left right) #'(modulo left right))] [honu-% (sl (left right) #'(modulo left right))]
[honu-/ (sl (left right) #'(/ left right))]))) [honu-/ (sl (left right) #'(/ left right))])
([honu-. (sl (left right) #'(field-access right left))])
))
(define-splicing-syntax-class (ternary context) (define-splicing-syntax-class (ternary context)
#:literals (honu-? honu-:) #:literals (honu-? honu-:)