Racket 将BNF语法转换为s表达式

Racket 将BNF语法转换为s表达式,racket,plai,Racket,Plai,我定义了一个名为msl #lang plai-typed (define-type msl [msl-num (n : number)] [msl-add (l : msl) (r : msl)] [msl-mul (l : msl) (r : msl)] [msl-sub (l : msl) (r : msl)] [msl-pow (l : msl) (r : msl)] [msl-error (s : string)] ) (define(** u t)

我定义了一个名为
msl

#lang plai-typed
(define-type msl
  [msl-num (n : number)]
  [msl-add (l : msl) (r : msl)]
  [msl-mul (l : msl) (r : msl)]
  [msl-sub (l : msl) (r : msl)]
  [msl-pow (l : msl) (r : msl)]
  [msl-error (s : string)]
  )

(define(** u t)
       (cond
         ((= u 1) t)
         (else
          (* t(**(sub1 u) t)))))
(define (parse [s : s-expression]) : msl
  (cond
    [(s-exp-number? s) (msl-num (s-exp->number s))]
    [(s-exp-list? s)
     (let ([sl (s-exp->list s)])
       (case (s-exp->symbol (first sl))
         [(+) (msl-add (parse (second sl)) (parse (third sl)))]
         [(*) (msl-mul (parse (second sl)) (parse (third sl)))]
         [ (-) (msl-sub (parse (second sl)) (parse (third sl)))]
         [ (**) (msl-pow (parse (second sl)) (parse (third sl))) ]
         [else (error 'parse "invalid list input")]))]
    [else (error 'parse "invalid input")]))
我有一个解析器函数,可以将
s-expression
转换为
msl

#lang plai-typed
(define-type msl
  [msl-num (n : number)]
  [msl-add (l : msl) (r : msl)]
  [msl-mul (l : msl) (r : msl)]
  [msl-sub (l : msl) (r : msl)]
  [msl-pow (l : msl) (r : msl)]
  [msl-error (s : string)]
  )

(define(** u t)
       (cond
         ((= u 1) t)
         (else
          (* t(**(sub1 u) t)))))
(define (parse [s : s-expression]) : msl
  (cond
    [(s-exp-number? s) (msl-num (s-exp->number s))]
    [(s-exp-list? s)
     (let ([sl (s-exp->list s)])
       (case (s-exp->symbol (first sl))
         [(+) (msl-add (parse (second sl)) (parse (third sl)))]
         [(*) (msl-mul (parse (second sl)) (parse (third sl)))]
         [ (-) (msl-sub (parse (second sl)) (parse (third sl)))]
         [ (**) (msl-pow (parse (second sl)) (parse (third sl))) ]
         [else (error 'parse "invalid list input")]))]
    [else (error 'parse "invalid input")]))

我的问题是:如何将
msl
表达式转换为
s-expression
?我是这门学科的初学者

你绝对可以做到这一点

在我回答这个问题之前。。。你为什么要这样做?为了实现评估器,通常不需要这样做

话虽如此:这相当简单。我将首先编写一些测试用例:

(test (unparse (msl-add (msl-num 3) (msl-num 4))) '(+ 3 4))
。。。以及代码本身

;; convert an msl to an s-expression:
(define (unparse parsed)
   (type-case msl parsed
      [msl-num (n) ...]
      ...))
。。。等等如果这不合理,请告诉我