fix parser so that it parses left to right

This commit is contained in:
jon 2010-04-22 15:07:48 -06:00 committed by Jon Rafkind
parent 72f83d19a9
commit 99e6eb5e9d

View File

@ -93,7 +93,29 @@
#:literals (operator ...) #:literals (operator ...)
(pattern operator #:attr func reducer) (pattern operator #:attr func reducer)
...) ...)
(define-splicing-syntax-class (do-rest context left)
(pattern (~seq (~var op operator-class)
(~var right (next context))
(~var new-right (do-rest context ((attribute op.func) left #'right.result))))
#:with result (attribute new-right.result))
(pattern (~seq) #:with result left))
(define-splicing-syntax-class (name context) (define-splicing-syntax-class (name context)
(pattern (~seq (~var left (next context))
(~var rest (do-rest context #'left.result)))
#:with result
(attribute rest.result)))
#;
(define-splicing-syntax-class (name context)
(pattern (~seq (~var left (next context))
(~var op operator-class)
(~var right (name context)))
#:with result
(cond [(attribute right)
((attribute op.func) #'left.result #'right.result)]
[else
#'left.result]))
#;
(pattern (~seq (~var left (next context)) (pattern (~seq (~var left (next context))
(~optional (~seq (~var op operator-class) (~var right (name context))))) (~optional (~seq (~var op operator-class) (~var right (name context)))))
#:with result #:with result
@ -111,11 +133,10 @@
;; Where operators defined higher in the table have higher precedence. ;; Where operators defined higher in the table have higher precedence.
(define-syntax (infix-operators stx) (define-syntax (infix-operators stx)
(define (create-stuff names operator-stuff) (define (create-stuff names operator-stuff)
(define make (syntax-lambda (expression next-expression operator-stuff) (define make (syntax-lambda (expression next-expression (ops ...))
#; #;
(printf "Make infix ~a ~a\n" (syntax->datum #'expression) (syntax->datum #'next-expression)) (printf "Make infix ~a ~a\n" (syntax->datum #'expression) (syntax->datum #'next-expression))
(with-syntax ([(ops ...) #'operator-stuff]) #'(define-infix-operator expression next-expression ops ...)))
#'(define-infix-operator expression next-expression ops ...))))
(for/list ([name1 (drop-last names)] (for/list ([name1 (drop-last names)]
[name2 (cdr names)] [name2 (cdr names)]
[operator operator-stuff]) [operator operator-stuff])