Parsing 用Racket#lang plai编写解析器

Parsing 用Racket#lang plai编写解析器,parsing,racket,Parsing,Racket,我需要在racket中为这个抽象语法编写一个解析器: ;; <DE> ::= <num> ;; | {distribution <num>*} ;; | {uniform <num> <num>} ;; | {+ <DE> <DE>} ;; | {- <DE> <DE>} ;; | {* <DE> <DE>} ;; |

我需要在racket中为这个抽象语法编写一个解析器:

;; <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?)])
注意,{uniform a b}是从a到b(包括a到b)的离散均匀分布。如果a>b,那么它是空的

这不是预期的工作,我不能得到它的权利。网络上没有帮助我的资源,或者至少我找不到

有人能解释我哪里错了,解决办法是什么吗?我真的不知道。谢谢

你给出的语法(与你围绕它写的散文相结合)让事情看起来有点模棱两可。因此,您可以用这种语言共享一些示例程序吗?
(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))]))