Python - 小LISP算术解释器

时间:2014-01-30 09:54:17

标签: python lisp interpreter

我输入A并需要使用Python

将其转换为B.

A:

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

B:

'1*2+(4-3)' 

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

这有两个部分:

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

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

2)一旦你有了一个令牌列表,你就可以将第一个元素从数组中删除并对其作出反应。即创建一个执行切割的函数,然后调用另一个函数来实际执行每个元素。在伪代码中:

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

等。即你所做的是通过抓取2个参数来递归解压缩表达式,再次使用parseOneElement。