Start | evaluera ast
 

Evaluera AST



Vi kan evaluera ett abstrakt syntax träd med en liten rekursiv funktion.

Enkelt AST

Säg att vi skapat ett AST träd utifrån något uttryck. Text skapat ett ast från ett prefix uttryck och vi har då fått nedanstående abstrakta syntax träd.
Att evaluera detta AST innebär att vi går igenom trädet med en rekursiv funktion. Om vi har att göra med ett löv i trädet, så returnerar vi siffran. Annars evaluerar vi respektive subträd och applicerar den operator som noden representerar (value).
class Node: def __init__(self, value): self.value = value self.left = None self.right = None def is_number(n): try: float(n) except: return False return True def construct_tree(prefix_expr): stack = [] tokens = prefix_expr.split()[::-1] for token in tokens: if is_number(token): stack.append(Node(token)) else: node = Node(token) node.left = stack.pop() node.right = stack.pop() stack.append(node) return stack.pop() def evaluate(node): # Om löv (nummer), returnera dess värde if(node.left==None and node.right == None): return float(node.value) # Annars, evaluera vänster och höger subträd left_value = evaluate(node.left) right_value = evaluate(node.right) # Utför operationen baserat på nodens värde if node.value == '+': return left_value + right_value elif node.value == '-': return left_value - right_value elif node.value == '*': return left_value * right_value elif node.value == '/': return left_value / right_value else: raise ValueError(f"Okänd operator: {node.value}") prefix = '- - 17 * 120.9 + 12 * 12 312 / 8 + 3 1' ast_tree = construct_tree(prefix) result = evaluate(ast_tree) print(f"Resultatet av uttrycket är: {result}")
14.591217041016 ms