【问题标题】:Python - little LISP arithmetics interpreter [closed]Python - 小 LISP 算术解释器 [关闭]
【发布时间】:2014-01-30 09:54:17
【问题描述】:

我有输入 A,需要使用 Python 将其转换为 B

答:

[['*', '1', '2', ['-', '4', '3']]]

乙:

'1*2+(4-3)' 

有人帮忙吗?

【问题讨论】:

  • 您正在寻找的是一个在 Python 中将前缀转换为中缀表示法的程序。还有,你输入的数据有误,应该是[['+', '*', '1', '2', ['-', '4', '3']]]
  • 为什么这个搁置范围太广了?它说“我有输入 A,需要使用 Python 将其转换为输入 B”。怎么会窄很多?
  • 我不是 python 程序员,但基本思想是在数组的所有其余元素之间获取数组的第一个元素,并递归地获取数组元素。我想你可以通过理解来做到这一点。例如。 ['+' '4' '5' [- '6' '3' '1']] => (4 + 5 + (6 - 3 - 1))
  • @uliwitness 我不认为它太宽泛了。但是 OP 需要付出一点努力(一些代码尝试),而不仅仅是“你能帮我解决我的问题吗?”如果没有任何进一步的信息,这可能只是一个要求为他们做家庭作业的请求。
  • 假设这是 Lispy,输入不需要是 ['+',['*','1','2'],['-','4','3']] → (+ (* 1 2) (- 4 3)) → ( (1 * 2) + (4 - 3)) 吗?

标签: python lisp interpreter


【解决方案1】:

这有两个部分:

1) 标记文本。也就是说,检查角色并构建仅包含各个部分的小对象。在 Python 中,您可以为此部分使用正则表达式,而在其他编程语言中,您只需构建一个微型状态机。因此,您的示例的令牌列表最终将是:

"[" "[" "*" "1" "2" "[" "-" "4" "3" "]" "]" "]"

2) 一旦你有了一个标记列表,你就可以从数组中删除第一个元素并对其做出反应。 IE。制作一个执行斩波的函数,然后调用另一个函数来实际执行每个元素。在伪代码中:

fun parseOneElement tokens
    switch pop(tokens)
        case "[": return parseBrackets(tokens)
        case "*": return parseMultiplication(tokens)
        case "-": return parseSubtraction(tokens)
        else: return it
    end
end

fun parseBrackets tokens
    result := parseOneElement(tokens)
    pop(tokens,"]") or die
    return result
end

fun parseMultiplication tokens
    arg1 := parseOneElement(tokens)
    arg2 := parseOneElement(tokens)
    return "(" . arg1 . "*" . arg2 . ")"
end

等等。 IE。您所做的是通过获取 2 个参数递归地解包表达式,再次使用 parseOneElement。

【讨论】:

  • 此源代码是用哪种编程语言编写的?
  • 没有特定的语言。只是我根据多年来看到的各种其他语言编写的临时伪代码。
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多