fix parser so that it parses left to right
This commit is contained in:
parent
72f83d19a9
commit
99e6eb5e9d
|
@ -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])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user