from lark import Lark, Transformer, v_args
import math

# --- 1. A GRAMÁTICA (SINTAXE) ---
gramatica_areas = """
    ?start: calculo
    calculo: "AREA" forma
    
    # Ramificação da Árvore de Decisão
    forma: quadrado | circulo
    
    quadrado: "QUADRADO" NUMBER ";"
    circulo: "CIRCULO" NUMBER ";"
    
    %import common.NUMBER
    %import common.WS
    %ignore WS
"""

# --- 2. O TRANSFORMER (SEMÂNTICA / CÁLCULO) ---
class CalculadorArea(Transformer):
    
    @v_args(inline=True)
    def quadrado(self, valor):
        # Converte o token NUMBER para float e calcula Lado * Lado
        lado = float(valor)
        area = lado ** 2
        return f"Área do Quadrado: {area:.2f}"

    @v_args(inline=True)
    def circulo(self, valor):
        # Calcula PI * Raio^2
        raio = float(valor)
        area = math.pi * (raio ** 2)
        return f"Área do Círculo: {area:.2f}"

    def calculo(self, children):
        # Retorna o resultado vindo da regra 'forma'
        return children[0]

# --- 3. EXECUÇÃO ---
parser = Lark(gramatica_areas)
calc = CalculadorArea()

# Testando os dois caminhos da Árvore de Decisão
print("--- RESULTADOS DOS CÁLCULOS ---")

# Caminho 1: Quadrado
quadrado = "AREA QUADRADO 5;"
arvore_q = parser.parse(quadrado)

print(f"--- Árvore de Decisão: '{quadrado}' ---")
print(parser.parse(quadrado).pretty())
print("--- Detalhamento:")
print(calc.transform(arvore_q))

# Caminho 2: Círculo

circulo = "AREA CIRCULO 10;"
arvore_c = parser.parse(circulo)

print(f"--- Árvore de Decisão: '{circulo}' ---")
print(parser.parse(quadrado).pretty())
print("--- Detalhamento:")
print(calc.transform(arvore_c))