我一直在寻找一个Python实现,它将中缀转换为前缀,在足够数量的算术和逻辑运算符上进行范围调整,并关心它在一个好的Python实现上的属性。更具体地说,我对出现在C程序的条件子句上的运算符感兴趣。(例如,它将在前缀中转换a > 0 && b > 1
由于我还是Python新手,如果有人能给我一些实现方法或者一些关于这方面的提示,我将不胜感激。
我在互联网上找到了一个实现,但它只关心更简单的操作符我有点不知道如何在这个版本上做到这一点,如果有人知道一个版本,已经包括所有的运营商,我会很高兴避免任何运营商被忽视的意外。
这种实现还应考虑括号。
如果你需要更多的细节,请评论!
谢谢您。

def parse(s):
for operator in ["+-", "*/"]:
    depth = 0
    for p in xrange(len(s) - 1, -1, -1):
        if s[p] == ')': depth += 1
        if s[p] == '(': depth -= 1
        if not depth and s[p] in operator:
            return [s[p]] + parse(s[:p]) + parse(s[p+1:])
s = s.strip()
if s[0] == '(':
    return parse(s[1:-1])
return [s]

最佳答案

我现在没有足够的时间来编写实现,但这里有一个我编写的实现,它将中缀转换为后缀(反向波兰)表示法(reference:Shunting-yard algorithm)。将此算法修改为do prefix并不太难:
ops是运算符标记的set()
prec是一个dict()
包含操作数标记作为键和整数作为运算符
优先权作为其值(例如{ "+": 0, "-": 0, "*": 1, "/": 1}
使用正则表达式将字符串解析为令牌列表。
(实际上,opsprec可以组合在一起)

def infix_postfix(tokens):
    output = []
    stack = []
    for item in tokens:
        #pop elements while elements have lower precedence
        if item in ops:
            while stack and prec[stack[-1]] >= prec[item]:
                output.append(stack.pop())
            stack.append(item)
        #delay precedence. append to stack
        elif item == "(":
            stack.append("(")
        #flush output until "(" is reached
        elif item == ")":
            while stack and stack[-1] != "(":
                output.append(stack.pop())
            #should be "("
            print stack.pop()
        #operand. append to output stream
        else:
            output.append(item)
    #flush stack to output
    while stack:
        output.append(stack.pop())
    return output

关于python - Python的Prefix实现的良好后缀涵盖了C程序的更多运算符(例如<,<=等)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11714582/

10-11 22:38
查看更多