我想创建一个函数,对于使用BNF表示法定义的以下语言。
expr:='['op expr expr']'|编号
op:='+'| ' - '| ''| '/' *
例如,假设函数名称是funct,那么
(funct '(+ 1 3)) => 4
(funct '(+ (- 3 1) 4) => 6
请给我一个提示或示例代码
答案 0 :(得分:1)
在Racket中,这可以直接使用:
[+ 2 3]
=> 5
请与您的口译员核实,您可能无法为此工作做任何事情。
答案 1 :(得分:0)
您是否在想这样的事情?
(define (ev exp)
(cond
((number? exp) exp)
((not (list? exp)) (error "not a list"))
((< (length exp) 2) (error "list too short"))
(else
(apply (case (car exp)
((+) +)
((-) -)
((*) *)
((/) /))
(map ev (cdr exp))))))
然后
> (ev '(+ 1 3))
4
> (ev '(+ (- 3 1) 4))
6