elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Asignar tipo a variables en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Asignar tipo a variables en C++  (Leído 2,953 veces)
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Asignar tipo a variables en C++
« en: 9 Abril 2021, 15:05 pm »

Estoy generando código C++ a partir de otro código de un lenguaje que estoy desarrollando. La funciones las estoy implementando rollo bash.

Sabeis como puedo declarar los argumentos? Estoy forzado a hacer type inference en el preprocesador/compilador y declarar un template por cada llamada que utilice un tipo distinto (la única solución que se me ocurrió hasta el momento) o conoceis alguna alternativa más sencilla?

CÓDIGO A TRANSPILAR/COMPILAR:
Código
  1. x = "Hello World";
  2. showHelloWorld() {
  3.  out($1);
  4.  return 6 * 7;
  5. }
  6.  
  7. showHelloWorld(x);
  8. x = 8;


CÓDIGO QUE GENERO:
Código
  1. #include <string>
  2.  
  3. using namespace std;
  4.  
  5. auto showHelloWorld($1);
  6.  
  7. int main() {
  8.  auto x = "Hello World" ;
  9.  showHelloWorld ( x ) ;
  10.  x = 8 ;
  11.  
  12.  return 0;
  13. }
  14.  
  15. auto showHelloWorld($1) {
  16.  cout << $1 << endl;
  17.  return 6 * 7 ;
  18. }


Lo que necesito hacer es asignarle un tipo (para que no de error) a los $1, $2, $3... y al $. Este último es un array con todos los argumentos dentro como en bash.

Hay que tener en cuenta que cada llamada a la función puede tener el mismo argumento con distinto tipo, ejemplo:
Código
  1. imprimir($1) {
  2.  cout << $1 << endl;
  3. }
  4.  
  5. int main() {
  6.  imprimir("hola");
  7.  imprimir(7);
  8.  // ...
  9. }

Se os ocurre alguna solución sencilla?


En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Asignar tipo a variables en C++
« Respuesta #1 en: 10 Abril 2021, 16:22 pm »

Ufff...

Un lenguaje no se crea de esa manera.
1 - Para crear un lenguaje, lo primero es crear una especificación del mismo, que recoja todo lo que contendrá y como será contenido.
2 - Le sigue la definición (por ejemplo) en código BNF, con lo que una vez completado se puede programar y abordar el análisis léxico y el sintáctico.
Nota que la primera parte sería en prosa y la una y la otra van íntimamente unidas, la primera detalla partes de la semántica que la segunda deje 'al aire'. Además puede debería recojer también ejemplos, de cada definición así saca de dudas ante alguna complejidad...
Esa definición además debe ser filtrada para eliminar ambigüedades, eliminar entradas no accesibles, etc... es todo un proceso que llega a ser un arte por sí mismo.

La parte que pides corresponde al análisis semántico, es absurdo tratarlo si  previamente no se ha ido incluyendo cada símbolo en la tabla de simbolos (durante las fases de análisis léxico y sintáctico).
Es derivable durante el análisis semántico, el tratamiento de tipos, así como capturar los errores no interceptables en las fases previas.
Llegado a ese punto, resulta absurdo traducir de un lenguaje fuente a otro lenguaje fuente, suele reservarse para casos concretos en los que aún no esté completo el compilador (generalmente para un sistema distinto a aquel en el que se está operando). Como mínimo, lo adecuaod al caso es que invocaras directamente el mismo compilador que usa el lenguaje al que querías traducir.
Aunque lo más óptimo (de cara al rendimiento), es pasarlo luego a un código intermedio, previas optimizaciones, para al final compilarlo al sistema de destino (con las correspondientes optimizaciones según el sistema destino).

Hay quien tira de herramienrtas externas, como Flex, Bison, etc... para simplificar partes de la implementación del lenguaje. Tiene su beneficio y su perjuicio. Aunque claro, el tiempo de aprendizaje del mismo no difiere sustancialmente de implementar uno mismo su propio programa. El peor perjuicio que yo veo al usar herramientas externas, es que tu lenguaje debe cumplir ciertos requisitos, para acoplarse correctamente con ellos y sobretodo que determinados errores, aunque los intercepte, no ofrecen detalles específicos (lógicamente es algo personalizado de cada lenguaje), que es la principal razón por la que mucos lenguajes devuelven mensajes de error crípticos e ininteligibles muchas veces.

Si a pesar de todo insistes seguir por el camino que llevas, lo más que puedo sugerirte es que tu array, debe alojar una estructura y que esa estructura sea lo suficientemente flexible para contener los diferentes tipos por puntero... básicamente en ese array tendrías que albergar lo que has omitido que es la tabla de símbolos:
Así dicha estructura podría contenener al menos estos campos:
- Nombre del parametro.
- Fue declarado-inicializado el tipo.
- Valor de la enumeracion del tipo (por ejemplo byte=2, char=3, entero = 4, buleano =1, etc...)
- Se recibe por valor o por una direccion (qué se almacena en la pila, su valor o la dirección donde consta el valor?)
- Es un tipo simple o compuesto (los complejos serían aquellos que recogen varios campos. string y array de (cualquier otro tipo) aunque caigan en esta categoría deben considerarse simples, por cuando el único otro campo preciso es su cantidad de elementos, y el valor puede ser accedido por un indice sin más complicaciones que veirificar sus limites..., digamos que string y array son intermedios entre simple y complejo, pero se tratan como simples en prácticamente todos los lenguajes).
- ...

Vamos lo cojas por donde lo cojas, exige una especificación prácticamente antes de escribir una sola línea de código.

p.d.: Si es solo cambiar parcialmente la sintaxis de un lenguaje, podría ser aceptable como lo llevas...


« Última modificación: 10 Abril 2021, 16:37 pm por Serapis » En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Asignar tipo a variables en C++
« Respuesta #2 en: 10 Abril 2021, 18:36 pm »

Ya resolví como hacerlo. Auto casi sirve para resolver el problema, variadic sirve pero es un malgasto de memoria porque reserva la mémoria máxima de un tipo para cada tipo. Por ejemplo reserva 32 bytes para un bool (1 byte). Any es la solución simple que estaba buscando.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[BATCH] asignar variables con set desde un for /f[Solucionado]
Scripting
haveavigar 5 7,200 Último mensaje 14 Enero 2011, 20:31 pm
por leogtz
asignar variables en .bat
Scripting
viejari 4 8,389 Último mensaje 31 Mayo 2012, 00:03 am
por viejari
Asignar variables de un webbrower aVB.
Programación Visual Basic
Menal_mur 0 1,557 Último mensaje 19 Agosto 2013, 17:25 pm
por Menal_mur
Asignar valores de un fichero a variables de una funcion
Programación C/C++
joelujos 0 1,822 Último mensaje 6 Diciembre 2015, 00:13 am
por joelujos
Como asignar tiupo a muchas variables
Programación C/C++
CBFD 9 4,418 Último mensaje 10 Mayo 2016, 11:52 am
por CBFD
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines