From bb57412242af1aef8738d90b4a527e15da785da9 Mon Sep 17 00:00:00 2001 From: Jon Rafkind Date: Mon, 16 Apr 2012 16:48:49 -0600 Subject: [PATCH] [honu] check for definitions before continuing to parse. completely parse the left hand side of an operator --- collects/honu/core/private/macro2.rkt | 2 +- collects/honu/core/private/parse2.rkt | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/collects/honu/core/private/macro2.rkt b/collects/honu/core/private/macro2.rkt index 536191051d..2417b21ad8 100644 --- a/collects/honu/core/private/macro2.rkt +++ b/collects/honu/core/private/macro2.rkt @@ -181,7 +181,7 @@ ;; instead of x_result. x_result is still there, too (with-syntax ([pattern-variable.name #'pattern-variable.result] ...) - (debug "~a = ~a\n" 'pattern-variable.name #'pattern-variable.name) ... + (debug "~a = ~a\n" 'pattern-variable.name (syntax->datum #'pattern-variable.name)) ... (parse-stuff action ...)) #'more #t)] [else (raise-syntax-error #f "Could not match macro" stx)] diff --git a/collects/honu/core/private/parse2.rkt b/collects/honu/core/private/parse2.rkt index 53ee99c947..1780cd0796 100644 --- a/collects/honu/core/private/parse2.rkt +++ b/collects/honu/core/private/parse2.rkt @@ -26,6 +26,7 @@ racket/splicing (only-in "literals.rkt" %racket) "compile.rkt" + "syntax.rkt" "extra.rkt")) (provide parse parse-all) @@ -227,7 +228,13 @@ body.result)))]) (define (definition? code) - #f) + (define (contains-define? code) + (syntax-parse code #:literals (define define-honu-syntax) + [(define x ...) #t] + [(define-honu-syntax x ...) #t] + [else #f])) + (and (parsed-syntax? code) + (contains-define? code))) ;; E = macro ;; | E operator E @@ -310,7 +317,7 @@ (debug "Reparsed output ~a\n" (pretty-format (syntax->datum re-parse))) (define terminate (definition? re-parse)) (debug "Terminate? ~a\n" terminate) - (if terminate? + (if terminate (values (left re-parse) #'rest) (do-parse #'rest precedence @@ -391,7 +398,7 @@ (define output (if current (if binary-transformer - (binary-transformer current right) + (binary-transformer (parse-all current) right) (error 'binary "cannot be used as a binary operator in ~a" #'head)) (if unary-transformer (unary-transformer right) @@ -622,7 +629,7 @@ (debug 2 "[~a] Parsed things ~a\n" context (parsed-things stx unparsed)) (if (parsed-syntax? parsed) (list (parsed-things stx unparsed) - (parsed-syntax parsed)) + parsed) (list (parsed-things stx unparsed) (parse-all parsed)))))))