首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将BNF文法转换为s-expression

将BNF文法转换为s-expression
EN

Stack Overflow用户
提问于 2015-02-16 02:35:04
回答 1查看 464关注 0票数 2

我定义了一个名为msl的语法

代码语言:javascript
复制
#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)))))

我有一个将s-expression转换为msl的解析器函数

代码语言:javascript
复制
(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?我是这方面的初学者

EN

回答 1

Stack Overflow用户

发布于 2015-02-18 06:20:58

你绝对可以做到。

不过,在我回答问题之前...你为什么要这样做?这通常不是实现赋值器所必需的。

话虽如此:它相当简单。我将从编写一些测试用例开始:

代码语言:javascript
复制
(test (unparse (msl-add (msl-num 3) (msl-num 4))) '(+ 3 4))

..。以及代码本身

代码语言:javascript
复制
;; convert an msl to an s-expression:
(define (unparse parsed)
   (type-case msl parsed
      [msl-num (n) ...]
      ...))

..。以此类推。如果这不合理,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28529613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档