regex 如何将一个混合了中缀和前缀子表达式的字符串转换为所有前缀子表达式?

dnph8jn4  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(85)

假设我有一个字符串公式,它是这样写的:“func(a+B,c)",其中func是自定义函数,该字符串包含中缀(即,+)和前缀(即,func)表示,我想把它转换成一个字符串,所有的前缀表示,“func(+(a,B),c)",我怎么做呢?
另一个例子是“func 1(a*(B+c),d)-func 2(e,f)”到“-(func 1((a,+(B,c)),d),func 2(e,f))”
更多背景:我想建立一个解析器,在那里用户将输入字符串格式的表达式,就像上面描述的那样,通常一个自定义函数将被写为前缀表达式,即。“func(a,B)",但由于共同的约定,人们仍然会将+-
/写在中缀表达式中,即“a+B”
如果一个表达式是以全中缀格式给出的,我可以很容易地将其转换为我预定义的树对象,但是如果一个表达式同时包含前缀和中缀格式,我不知道如何将其转换为树对象,因此需要询问如何将字符串转换为全中缀格式。
我没有使用解析器的经验,感谢任何初始指导。

tvmytwxo

tvmytwxo1#

如果您解析的语言与Python类似,则可以使用内置的ast模块提供的Python解析器,并在您感兴趣的节点上实现访问者,以构建前缀表达式。例如,您可以尝试以下操作:

import ast

def printc(*args): print(*args, end='')

class PrefixPrinter(ast.NodeVisitor):
    def visit_BinOp(self, node):
        if type(node.op) == ast.Add:
            printc("+")
        if type(node.op) == ast.Sub:
            printc("-")
        if type(node.op) == ast.Mult:
            printc("*")
        if type(node.op) == ast.Div:
            printc("/")
        printc("(")
        self.visit(node.left)
        printc(",")
        self.visit(node.right)
        printc(")")

    def visit_Call(self, node):
        self.visit(node.func)
        printc("(")
        for index, arg in enumerate(node.args):
            self.visit(arg)
            if index < len(node.args) - 1:
                printc(", ")
        printc(")")

    def visit_Name(self, node):
        printc(node.id)

first_example = "func(a+b,c)"
second_example = "func1(a*(b+c),d)-func2(e,f)"
printc(f"{first_example=} converts to ")
PrefixPrinter().visit(ast.parse(first_example))
print()
printc(f"{second_example=} converts to ")
PrefixPrinter().visit(ast.parse(second_example))
print()

执行:

$ python3 to_prefix.py 
first_example='func(a+b,c)' converts to func(+(a,b), c)
second_example='func1(a*(b+c),d)-func2(e,f)' converts to -(func1(*(a,+(b,c)), d),func2(e, f))

相关问题