close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 15 years ago

Closed 15 years ago

Last modified 15 years ago

#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 Víctor de Buen Remiro)

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 Víctor de Buen Remiro

Description: modified (diff)
Status: newaccepted

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í:

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" ]]) }
 ]];

o así

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"}  ]])
 ]];

No obstante, volveré a intentar una vez más que funcione esa combinación ({...})

comment:2 Changed 15 years ago by Víctor de Buen Remiro

Summary: Problemas con SetToNameBlockProblemas en el parser con la combinación de parentesis y llaves

comment:3 Changed 15 years ago by Víctor de Buen Remiro

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 Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

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 ...

comment:5 Changed 15 years ago by Víctor de Buen Remiro

(In [1539]) Fixes #760

Note: See TracTickets for help on using tickets.