我需要在球拍中为这个抽象语法编写一个解析器:
;; <DE> ::= <num>
;; | {distribution <num>*}
;; | {uniform <num> <num>}
;; | {+ <DE> <DE>}
;; | {- <DE> <DE>}
;; | {* <DE> <DE>}
;; | {with {<id> <DE>} <DE>}
;; | <id>
(define-type Binding
[binding (name symbol?) (named-expr DE?)])
(define-type DE
[distribution (values (listof number?))]
[id (name symbol?)]
[binop (op procedure?) (lhs DE?) (rhs DE?)]
[with (b Binding?) (body DE?)])
到目前为止我所拥有的是:
(define (parse sexp)
(match sexp
[(? symbol?) (id sexp)]
[sexp (distribution (values (list sexp)))]
[(list '+ l r) (binop + (parse l) (parse r))]
[(list '- l r) (binop - (parse l) (parse r))]
[(list '* l r) (binop * (parse l) (parse r))]))
注意{uniform a b}是从a到b(包括)的离散均匀分布。如果a> b,然后它是空的。
这不能按预期工作,我无法做到正确。网上没有资源可以帮助我,或者至少我找不到它们。
有人能够解释我哪里错了,解决方案是什么?我真的不知道。谢谢!