我正在编写一个函数,它接受一个涉及数字,变量和运算符的带引号的算术中缀表达式,并将其转换为前缀表示法。
例如:
(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))))
哪个是正确的顺序,但由于优先权,括号关闭。我做了一些研究,很难搞清楚如何添加它。
关于如何重构我的代码的任何反馈或建议都会很棒。谢谢!
答案 0 :(得分:0)
基本上,这是解析的问题。有很多的不同方法可以解决它,但除了完全括号外,它们都不是微不足道的。但大概这一点就是使用没有括号的中缀。
如果我试图快速实现这一点,我会使用一个现有的Racket解析器包;可能是parsack或ragg或更传统的parser-tools。