在Racket #lang plai中编写解析器

时间:2017-09-21 15:16:03

标签: parsing 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?)])

到目前为止我所拥有的是:

(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,然后它是空的。

这不能按预期工作,我无法做到正确。网上没有资源可以帮助我,或者至少我找不到它们。

有人能够解释我哪里错了,解决方案是什么?我真的不知道。谢谢!

0 个答案:

没有答案