from lark import Lark

# =============================================================
# GRAMÁTICA DE CONFIGURAÇÃO (SEQUENCIAL)
# =============================================================
gramatica_config = """
    # O objetivo final é uma 'configuracao'
    start: configuracao

    # A REGRA DA ORDEM:
    # O parser SÓ aceita se vier primeiro o HOST, depois PORTA, depois START.
    configuracao: host_decl porta_decl start_cmd

    host_decl: "HOST" TEXTO ";"
    porta_decl: "PORT" NUMBER ";"
    start_cmd: "RUN" ";"

    # Definição de tipos básicos
    TEXTO: /"[^"]*"/
    %import common.NUMBER
    %import common.WS
    %ignore WS
"""

parser = Lark(gramatica_config)

# --- CASO 1: ORDEM CORRETA ---
print("--- Teste 1: Ordem Correta ---")
config_correta = 'HOST "servidor.com"; PORT 8080; RUN;'
print(parser.parse(config_correta).pretty())

# --- CASO 2: ORDEM INCORRETA ---
print("\n--- Teste 2: Ordem Incorreta (PORT antes de HOST) ---")
config_errada = 'PORT 8080; HOST "servidor.com"; RUN;'

try:
    parser.parse(config_errada)
except Exception as e:
    # O erro acontece porque o Parser Top-Down "olhou" para o topo da regra 
    # 'configuracao' e esperava o token 'HOST', mas encontrou 'PORT'.
    print("❌ ERRO SINTÁTICO: A ordem dos fatores alterou o produto!")
    print("O compilador esperava 'HOST' no início do arquivo.")