#760 closed defect (fixed)
Problemas en el parser con la combinación de parentesis y llaves
Reported by: | Liván Ramírez Dorta | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | highest | Milestone: | |
Component: | Kernel | Version: | 2.0.1 |
Severity: | blocker | Keywords: | |
Cc: |
Description (last modified by )
Al ejecutar lo siguiente:
NameBlock Fun(Set s){ NameBlock k = SetToNameBlock(s) }; NameBlock KK = [[ NameBlock Eco = Fun({[[Text cod = "Eco"]]}); NameBlock Cli = Fun({[[Text cod = "Cli"]]}); NameBlock kk = Fun({[[Text cod = "kk"]]}) ]];
obtenemos el siguiente error:
ERROR: [1] Variable 'cod' ya definida como "k::cod "
Change History (5)
comment:1 Changed 15 years ago by
Description: | modified (diff) |
---|---|
Status: | new → accepted |
comment:2 Changed 15 years ago by
Summary: | Problemas con SetToNameBlock → Problemas en el parser con la combinación de parentesis y llaves |
---|
comment:3 Changed 15 years ago by
Este otro ejemplo simplificado da el mismo tipo de error
Text ({ txt="a" }); Text ({ txt="b" });
Mientras que esto otro funciona
Text {( txt="a" )}; Text {( txt="b" )};
Parece que sólo depende del orden pues esto funciona
Set {[[ Text txt="a" ]]}; Set {[[ Text txt="b" ]]};
y esto otro no
Set [[{ Text txt="a"} ]]; Set [[{ Text txt="b"} ]];
comment:4 Changed 15 years ago by
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
No encuentro ninguna forma de que el parser actúe correctamente pero al menos parece que puedo conseguir que sea coherente, y si no lo va a saber tratar como es debido que al menos sea prudente y dé un mensaje de error que haga facil encontrar y solucionar los problemas derivados.
El mensaje será de la forma
Error: Secuencia inválida ({ ... }) en ...
o bien
Error: Secuencia inválida [[{ ... }]] en ...
No hay ningún problema con la función
SetToNameBlock
El problema es del parser que "se traga" la llave en la combinación de paréntesis y llave consecutivas. Por este motivo se quedas las variables
cod
todas en el mismo ámbito y da error a partir der la segunda, simplemente porque ya existe. Es un viejo problema con difícil solución, ya lo he intentado varias veces sin éxito, pues si se prescinde del mecanismo que elimina esas llaves entonces fallan otras cosas. Sin embargo, es muy fácil evadirse de este problema, basta con escribirlo así:o así
No obstante, volveré a intentar una vez más que funcione esa combinación
({...})