运算符优先前缀转换 - Scheme

时间:2016-02-24 15:58:47

标签: scheme prefix infix-notation operator-precedence

我正在编写一个函数,它接受一个涉及数字,变量和运算符的带引号的算术中缀表达式,并将其转换为前缀表示法。

例如:

 (infix->prefix '(2 + 3 * x ^ 5 + a))

将评估为

(+ 2 (+ (* 3 (^ x 5)) a))

(+ (+ 2 (* 3 (^ x 5))) a)

按优先顺序排列:+, - ,*,/和^。

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

 (define (infix->prefix lst) 
   (if (list? lst)
   (if (null? (cdr lst))
      (car lst)
      (list (cadr lst)
            (infix->prefix (car lst))
            (infix->prefix (cddr lst)))
      )
   lst)
  )

这给出了正确的前缀表示法,但没有优先权。它评估为

(+ 2 (* 3 (^ x (+ 5 a))))

哪个是正确的顺序,但由于优先权,括号关闭。我做了一些研究,很难搞清楚如何添加它。

关于如何重构我的代码的任何反馈或建议都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

基本上,这是解析的问题。有很多的不同方法可以解决它,但除了完全括号外,它们都不是微不足道的。但大概这一点就是使用没有括号的中缀。

如果我试图快速实现这一点,我会使用一个现有的Racket解析器包;可能是parsackragg或更传统的parser-tools