【问题标题】:Operator precedence prefix conversion - Scheme运算符优先级前缀转换 - 方案
【发布时间】:2016-06-07 00:34:45
【问题描述】:

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

例如:

 (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))))

这是正确的顺序,但括号因优先级而关闭。我做了一些研究,很难弄清楚如何添加它。

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

【问题讨论】:

    标签: scheme prefix infix-notation operator-precedence


    【解决方案1】:

    本质上,这就是解析的问题。有 很多 种不同的方法来解决它,但除了全括号外,它们都不是微不足道的。但大概这样做的全部意义在于使用不带括号的中缀。

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

    【讨论】:

    • 谢谢!作业是上课的,我认为我们不能使用球拍,但我会调查它以获得进一步的帮助。
    • 如果是上课,你的老师肯定会引导你使用特定的解析技术......?
    • ... 或者她或他只是想让你先使用优先级最低的运算符分解它,然后再细分直到你得到一棵完整的树?不管怎样,我猜作业中描述了一个特定的策略。
    • 是的。我做了一个函数来检查优先级。我只是在哪里应用该功能以及如何应用该功能时遇到问题。如果我有新代码,我可以在哪里添加?作为编辑?新手。
    猜你喜欢
    • 2015-09-16
    • 2019-11-06
    • 2011-08-30
    • 2014-02-24
    • 2021-10-25
    • 2017-07-04
    • 2012-05-04
    • 2021-01-01
    • 2018-08-22
    相关资源
    最近更新 更多