141 lines
4.9 KiB
Python
141 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
import sys
|
||
import os
|
||
|
||
# Agregar el directorio padre al path
|
||
sys.path.append('.')
|
||
|
||
# Importar el convertidor
|
||
from x1_lad_converter import SimpleLadConverter
|
||
|
||
def test_arraytoreal():
|
||
"""Probar específicamente ARRAYTOREAL.EXP para verificar preservación de indentación"""
|
||
print("=== TEST: ARRAYTOREAL.EXP - Preservación de indentación ST ===")
|
||
print("-" * 60)
|
||
|
||
# Buscar el archivo
|
||
possible_paths = [
|
||
"ExportTwinCat/ARRAYTOREAL.EXP",
|
||
"../ExportTwinCat/ARRAYTOREAL.EXP",
|
||
"../../ExportTwinCat/ARRAYTOREAL.EXP",
|
||
"C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/ExportTwinCat/ARRAYTOREAL.EXP"
|
||
]
|
||
|
||
test_file = None
|
||
for path in possible_paths:
|
||
if os.path.exists(path):
|
||
test_file = path
|
||
break
|
||
|
||
if test_file is None:
|
||
print(f"❌ Error: No se encontró ARRAYTOREAL.EXP")
|
||
return
|
||
|
||
print(f"✓ Archivo encontrado: {test_file}")
|
||
print("-" * 60)
|
||
|
||
# Leer archivo original para mostrar indentación
|
||
print("📄 CÓDIGO ORIGINAL:")
|
||
with open(test_file, 'r', encoding='utf-8', errors='ignore') as f:
|
||
original_lines = f.readlines()
|
||
|
||
# Mostrar solo las líneas de código ST (después de (* @END_DECLARATION := '0' *))
|
||
st_start = False
|
||
for i, line in enumerate(original_lines):
|
||
if "@END_DECLARATION" in line:
|
||
st_start = True
|
||
continue
|
||
if st_start and line.strip() and not line.strip().startswith("END_FUNCTION"):
|
||
print(f" {i+1:2d}: '{line.rstrip()}'")
|
||
|
||
print("-" * 60)
|
||
|
||
# Crear convertidor
|
||
converter = SimpleLadConverter()
|
||
|
||
# Parsear archivo
|
||
print("🔍 PARSEANDO ARCHIVO...")
|
||
converter.parse_file(test_file)
|
||
|
||
print(f"\n📊 INFORMACIÓN DETECTADA:")
|
||
print(f" ✓ Tipo: {getattr(converter, 'program_type', 'PROGRAM')}")
|
||
print(f" ✓ Nombre: {converter.program_name}")
|
||
print(f" ✓ Path: {converter.program_path}")
|
||
print(f" ✓ Variables: {list(converter.var_sections.keys())}")
|
||
print(f" ✓ Código ST: {'Sí' if converter.st_main_code else 'No'}")
|
||
|
||
if converter.st_main_code:
|
||
print(f"\n📝 CÓDIGO ST EXTRAÍDO ({len(converter.st_main_code)} caracteres):")
|
||
for i, line in enumerate(converter.st_main_code.split('\n')[:10], 1):
|
||
print(f" {i:2d}: '{line}'")
|
||
|
||
# Generar código SCL
|
||
print(f"\n📝 GENERANDO CÓDIGO SCL...")
|
||
scl_code = converter.convert_to_structured()
|
||
|
||
# Guardar archivo de prueba
|
||
output_file = "test_arraytoreal_indent.scl"
|
||
with open(output_file, 'w', encoding='utf-8') as f:
|
||
f.write(scl_code)
|
||
|
||
print(f" ✓ Guardado en: {output_file}")
|
||
|
||
# Mostrar código SCL generado
|
||
print(f"\n📄 CÓDIGO SCL GENERADO:")
|
||
lines = scl_code.split('\n')
|
||
|
||
# Encontrar línea donde empieza el código ST
|
||
st_start_line = -1
|
||
for i, line in enumerate(lines):
|
||
if "Código ST original" in line:
|
||
st_start_line = i
|
||
break
|
||
|
||
if st_start_line > -1:
|
||
# Mostrar desde el código ST hasta el final de la función
|
||
for i in range(st_start_line, min(st_start_line + 20, len(lines))):
|
||
if i < len(lines):
|
||
line = lines[i]
|
||
if line.strip() and ("END_FUNCTION" in line or "END_PROGRAM" in line):
|
||
print(f" {i+1:2d}: {line}")
|
||
break
|
||
print(f" {i+1:2d}: {line}")
|
||
|
||
# Verificar preservación de indentación
|
||
print(f"\n🔍 VERIFICANDO PRESERVACIÓN DE INDENTACIÓN:")
|
||
|
||
if converter.st_main_code:
|
||
original_lines = converter.st_main_code.split('\n')
|
||
scl_lines = scl_code.split('\n')
|
||
|
||
# Encontrar líneas con indentación en el original
|
||
original_indented = []
|
||
for line in original_lines:
|
||
if line.startswith('\t') or line.startswith(' '):
|
||
original_indented.append(line)
|
||
|
||
# Verificar que se preserven en el SCL
|
||
if original_indented:
|
||
print(f" 📋 Líneas con indentación original: {len(original_indented)}")
|
||
print(f" Ejemplo: '{original_indented[0]}'" if original_indented else "")
|
||
|
||
# Verificar si aparecen en el SCL preservadas
|
||
preserved_count = 0
|
||
for orig_line in original_indented:
|
||
for scl_line in scl_lines:
|
||
if orig_line.strip() in scl_line and orig_line.startswith(('\t', ' ')):
|
||
preserved_count += 1
|
||
break
|
||
|
||
print(f" ✅ Indentación preservada: {preserved_count}/{len(original_indented)} líneas")
|
||
else:
|
||
print(f" ℹ No se encontraron líneas con indentación específica")
|
||
else:
|
||
print(f" ⚠ No hay código ST para verificar")
|
||
|
||
return scl_code
|
||
|
||
if __name__ == "__main__":
|
||
test_arraytoreal() |