Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#581
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...
#582
Un poco off-topic...

Cita de: #!drvy en  8 Abril 2021, 14:45 PM
De este tema ya se ha hablado varias veces en el foro, incluidas varias noticias que has posteado tu mismo @El_Andaluz...

https://foro.elhacker.net/foro_libre/casi_800_millones_de_cuentas_de_correo_hackeadas_iquestcomo_saber_si_has_sido_hackead-t491748.10.html
Vaya, esto me ha refrescado que a raíz de aquel hilo y el problema que me encontré con prácticamente cada editor, es que se emperran en cargar en memoria el fichero completo, lo que admás de impráctico (para determinadas tareas sobre todo), si no tienes tanta RAM, no puede operar con el fichero (es un problema que se ha dado con cierta frecuencia, pero es a raíz de ese hilo que...), por lo que decidí, hacerme un editor hexadecimal (sencillo), que leyera solo 1-4 kb, de la posición elegida desde un scroll... y que las búsquedas las hiciera de igual forma (en segundo plano, cuando encuentre un hallazgo, carga su 'pagina' y que espere a que se pulse 'buscar siguiente').

Esta solución implica, emplear más tiempo en lectura a fichero a cambio de mantener la memoria prácticamente sin cambios... lo dejé medio funcionando y luego por carga de trabajo lo aparté y lo tenía completamente olvidado... vuelta a retomarlo...

#583
Cita de: Hangaro en  8 Abril 2021, 00:05 AM
.. .. por cada libro dberian plantar un arbol 
Tranquilo, yo al menos he plantado más árboles que el papel que ocupen mis libros...
Seguramente en tu casa tengas puertas, ventanas, mesas, sillas, etc... de madera. Aplícate la misma regla (incluída los latigazos).

En realidad, los árboles debería plantarlos quien los tala (al margen de incendios u otras catástrofes).
Me preocupa enormemente más la contaminación derivada del petróleo en todas sus formas y variedades.
#584
Cita de: Machacador en  7 Abril 2021, 17:52 PM
Hollywood y sus películas son una máquina del tiempo... siempre se adelantan a lo que va a suceder... desastres, pandemias, viajes espaciales, presidentes negros en países racistas, todo lo fantasioso que ponen en sus películas sucede luego...
Jajaja...
hay películas donde la Tierra es aniquilada (ej: Guía del autoestopista galáctico),
películas donde la Tierra es tranformada y todavía habitable (ej: El planeta de los simios)
o inhabitable durante quien sabe cuanto (ej: la serie los 100),
o solo irrespirable pero todavía habitable (ej: Blade Runner),
hay películas donde la tierra es perdonada (ej: ultimatum a la Tierra),
películas donde se cree exterminada y luego resulta que no (ej: la serie Galactica)
y películas donde la amenaza es reducida (ej: Mars attack) de este caso quizás sea de las que más haya...

Si compras todos los boletos, será difícil que no te toque, así que a cuál te refieres tu???. ...en relación a "se adelantan a lo que va a suceder".
#585
Cita de: Meta en  7 Abril 2021, 19:17 PM
La idea es que me detecte las unidades de disco que tengo instalada o detectada. ;)
Usa GetDevices... quizás tengas que añadir una referencia al ensamblado.
#586
Me obligas a leerme el pdf, y es precisamente lo que uno trata de evitar, porque ir al detalle fino, requiere mucho más tiempo en responder y sale un mensaje más largo.

Es definitiva es como te señalaba en mi mensaje anterior...
En ese incluí el ejemplo para decodificar un supuesto comando de la bateria (que existe se llama B (Battery), pero con sus valores específicos).

El comando X27, viene explicado también en el pdf, recibe '#' con 6 bytes, un cóoodigo de error viene en la forma: "#- loque sea".

Lo más sencillo al caso una vez leído por encima en pdf, es hacer un parsing genérico y luego especifico para cada comando... es más o menos el pseudocódigo previo que puse en mi mensaje anterior... la parte del preparsing, sería algo como:


enumeracion PartesResultado
  COMANDO_INICIO = 35  // el ASCII de '#'
  COMANDO_FIN = 13  // el ASCII de 'retorno de carro
  //COMANDO_MEDIO = 1   // referencia al medio, luego se explica mejor.
fin enumeracion


Ahora una funcion que preprocesa el comando recibido:

funcion ParsingComando(string comando, string valor)
   entero inicio, cantidad

   si ((valor comienza con COMANDO_INICIO) y (termina con COMANDO_FIN))
       
       Si (valor.charat(1) = "-")          // parece ser un código de error. "#- loquesea"
            llamada a InterpetarCodigoError(substring(valor, 2,1))   //enviamos el carácter 3 de los 4 que tiene
              // (ignoro si tienen más de 1 byte-char como codigo de error.
       Sino  // el resultado tiene valores interpretables:
           // enviamos ya 'recortdo' el string, sin los caracteres inicial y final
           inicio = 1
           cantidad =  valor.length -2
           llamada a ProcesarComandos(comando, valor.Substring(inicio, cantidad))
         
       fin si
   sino
       mensaje = "Error, el valor del comando recibido, tiene un formato desconocido..."
   fin si
fin funcion


Como decía conviene tener una enumeracion que represente cada comando:
Hay todos estos comandos:  "The I, O, L, B, V, T, F, H, R, C, Q, S, W, X are single uppercase

enumeracion ComandosSAI
   SAI_COMANDO_BATERIA = 66    // ASCII de 'B'
   SAI_COMANDO_UTILITY_VOLT = 73  // ASCII de 'I' (una 'i').
   //
   //
   ...
   SAI_COMANDO_STATUS_FLAG = 83  //ASCII de 'S'.
   SAI_COMANDO_W...     = 87   //   idem de 'W'
   SAI_COMANDO_X...     = 88   // " 'X'
character"



La funcion procesar comando, tendrá en selector de casos, con un caso para cada comando que te interese y un 'else', para el resto...
Esto viene a ser equivalente al código de más arriba, solo que allí se recibía 1 solo byte y se ejemplificaba solo el comando 'B' de batería.
Algunos comandos  como el X, tienen 'subcomandos' en la forma Xn, donde 'n' es un numero...
Estos comandos dento de su 'caso', examina precisamente el 'subcomando', y lo gestiona a su vez con otro 'selector de casos'.
Como los comandos al final tienen varos bytes, interesa más hacer una llamada en esta funcion para dedicar una funcion exclusiva para procesar cada comando o subcomando, incluso aunque haya partes comunes entre ellos, será m
ás fácil de implementar y de mantener aunque sea a costa de más código:


funcion ProcesarComandos(string comando, string valor) //valor ya viene filtrado de # y 'cr'
  ComandosSAI SaiComando = comando.left(1).ToByte
 

   seleccionar caso para SaiComando
       caso SAI_COMANDO_BATERIA
           llamada a ProcesarBateria(valor)
       caso SAI_COMANDO_UTILITY_VOLT
           llamada a ProcesarUtilityVolt(valor)
          ....
       caso SAI_COMANDO_STATUS_FLAG
           llamada a ProcesarStatusFlag(valor)
       caso SAI_COMANDO_W...
           llamada a ProcesarW(valor)
       caso SAI_COMANDO_X...
            comando = comando.substring(1, comando.length-1)
            llamada a ProcesarX(comando, valor)   // <-------- ejemplo de un comando que tiee subcomandos
       otros casos
               mensaje "Actualmente no procesamos el comando: " + comando + nuevalinea + valor
   fin casos
fin funcion

funcion ProcesarX(string comando, string valor)
   byte servico = comando.Tobyte

   seleccionar caso para servicio
       caso 5    
       caso 15  
         ...
       caso 27   // tiene 6 chars
           llamada a ProcesarX27(valor)
       caso 28
         ...
       otros casos
           mensaje "Actualmente noe staos procesando el subcomando '" servicio.Tostring + "' del comando 'X', con valor: " + valor
   fin seleccionar casos
fin funcion

// Según el pdf: #output_voltage,high_transfer_voltage,low_transfer_voltage, battery_threshold,runtime_threshold<cr>
funcion ProcesarX27(string valor)
   llamada a procesarOutputVoltage(valor.charat(0).tobyte)
   llamada a procesarHighTransferV(valor.charat(1).tobyte)    
   llamada a procesarLowTransferV(valor.charat(2).tobyte)
   llamada a procesarBatteryThreshold(valor.charat(3).tobyte)
   llamada a procesarThreshold(valor.substring(4,2))      // este parametro ocupa creo que 2 bytes.
fin funcion


Y bueno, este es el esqueleto para decodificar todo... fíjate que es un simple parsing, donde primero se verifica si el resultado es un codigo de erro o no... sino, luego se verifica que comando se trata, luego cada comando si tiene subcomandos, deriva a otra funcion que identifique de qué subcomando se trata, al final cada comando final, tiene que ser procesado individualmente, porque los bits de cada uno tendran un significado unico y específico...
El caso de error, igualmente en su llamada debe derivar descendeidno e comandos y subcomandos, segun sea el caso, para que al final procesar el error. Ignoro si cuando es un código de error, se compone de un unico byte o más... si es solo uno, una unica funcion (a nivel de comandos y subcomandos) podría ser suficiente, en cambio si tiene varios bytes, y el codigo puede ser excesivo (generaría una función muy larga), convendría en ese caso, tener una etapa más donde se procese cada byte (si cada bit tiene un significado propio, si cada byte tiene un significado propio es lo mismo que recibir 1 solo byte con significado propio a nivel de bit (o más de 1).

En fin, el trabajo no es complicado, solo largo y algo tedioso, porque son más de una docena de comandos y algunos tienen subcomandos, y luego cada caso se procesa a nivel de bit, por lo que necesitas constantes a mogollon...

pd.: Olvidaba adjuntar una captura que hice, para que veas que viene explicado, tienes que leerlo primero entero, para tener una idea global y luego ocn más detenimiento en el apartado que más te interese, si te interesan todos, pués paciencia, hoy uno y mañana otro.
#587
Es aún más sencillo, en NET muchas colecciones admiten la adicion de un array directamente con 'AddRange', lo que nos evita la necesidad de usar un bucle...

Código (CSHARP) [Seleccionar]

private void button1_Click(object sender, EventArgs e)
       {        
           string[] uds= "C:D:F:G:".Split(':');
           comboBox1.Items.AddRange(uds);

           //comboBox1.Items.AddRange(unidades.Split(':'));  //el Split se puede hacer en una sola linea.
       }


Si además quieres que aparezcan los dos puntos, es preferible modificar el string de entrada, remplazando los dos puntos por los puntos y un espacio (y entonces hacer el Split por el espacio).
#588
Yo pienso más bien que es tu propio equipo quien está bloqueando los accesos a dicho sitio.
Si intentas acceder desde otra red que no sea la tuya y tienes acceso, que luego no lo tengas desde tu propia red, significa eso, que tu red te está bloqueando.

...diría que es cosa del PC, pero si resuta que también estás bloqueado con acceso desde el móvil, entonces parece más cosa del router (salvo que el móvil tenga acceso a la red a través del PC).

p.d.:
Además, antes de pensar en otra cosa, tienes que partir de lo más cercano y una vez demostrado que ahí no radica el problema te vas 'alejando'. Así lo primero es tu PC, y luego tu red, luego tu proveedor, etc... de cerca a lejos. Si no es fácil da rpalos de ciego (aunque a veces la suerte ayuda si no hay mucha variedad de posibilidades).
#589
De los que ha puesto DoeJohn , tengo los dos del centro, "Programacion en  lenguaje Cobol" (tengo alguno más de Pascual Galán) y el de "Guía del programador en ensamblador...", desde mediados de los 80 en adelante, la editorial Anaya empezó a sacar muy buenos libros de programación... lo bueno de ese libro, es que tiene unas pastas superduras, cubiertas en plástico, que protegen muy bien los diskettes de 5 1/4 que trae dentro de la portada. Y dentro quedaba enfundado el libro por la contraportada. Los que no incluían disquettes, no traían esa cubierta extra.
Del de D.Hergert de QuickBasic, tengo otra versión, no recuerdo ahora cual...

Del que pone Tachikomaia, no se si ese exactamente (hay un montón con portadas muy similar), pero tengo más de 100 libros solo del BASIC de los 80, enfocados la mayoría al Spectrum. Por cierto, tengo la 2edicion del de Kemeny y Kurt (los creadores del lenguaje BASIC, para interesados) que data del 71, la primera edición data del 67.

Cita de: DoeJohn en  6 Abril 2021, 21:37 PM
Tengo muchos más por ahí, en aquella época no existía internet!!
Uffff... yo debo tener unos 1000 libros (a ojo, nunca los he contado, aunque siempre estoy con la idea de que tengo que indexarlos, pero "en casa de herrero..."), desde finales de los 60 hasta practicamente ahora (bueno este añao y el pasado por culpa del virus, prácticamente no he comprado)...
Yo opino que cualquier programador al que le guste su profesión debería comprarse como mínimo 1 libro al mes, o 3-4 al año. Los hay que no compran ninguno en años y otros como yo, que a lo largo de la vida han comprado 1-4 cada mes, aunque también ha habido lagunas de varios meses sin comprar ninguno.

Cita de: DoeJohn en  6 Abril 2021, 21:37 PM
haciendo un poco de limpieza en casa de mis padres
Yo también guardo aún alguno en casa de mi madre (ya falleció, pero mantenemos la casa para ir de vacaciones), pero siempre que me vuelvo con las restricciones de equipaje en los aeropuertos, se me hace complicado/caro traerlos... Antes de esas restricciones, me los fuí trayendo poco a poco.
#590
No estoy seguro de entenderte, pero quizás si...

Tu lo que creo que quieres ahora es decodificar el byte que te llega...Si es así, es suficiente pcoo código, bastan unas constantes, y un par de funciones...

Déjame que parta de un ejemplo con suposiciones (abstracción, no necesito empaparme del asunto concreto que trates).

// Constantes para la bateria: (un supuesto comando, que te devuelve 1 byte y cada bit tiene un significado propio)
Enumeracion ConstantesDeBateria
   BATERIAPRESENTE = 1   // 0000.0001
   BATERIAAGOTADA = 2   //  0000.0010
   BATERIACARGANDO = 4 // 0000.0100
   BATERIAAL80OMAS = 8 // 0000.1000
   BATERIAW = 16 // 0001.0000
   BATERIAX = 32  // 0010.0000
   BATERIAY = 64 // 0100.0000
   BATERIAZ= 128 // 1000.0000
Fin enumeracion

enumeracion ConstantesDeComandos
   COMANDO_BATERIA = 136  // POR EJEMPLO
   ...otros comandos (aunque algunas veces admiten string en vez de numeros, no creo que sea el caso presente).
fin enumeracion

array de string mensajeBateriaOK(0 a 7)  //mensaje generico para cada bit cuando es '1'.
array de string mensajeBateriaNO(0 a 7)  // mensaje generico para cada bit cuando es '0'.


// el comando típicamente podría quedar aparte del valor (no ser recibido, solo enviado), o podria venir conjunto, precediendo o sucediendo uno al otro, depende de qué hardware se trate...
funcion RecibirComando(ConstantesDeComandos comando, byte valor)
   selecccionar caso comando
       caso COMANDO_BATERIA
           llamada a ProcesarBateria(valor)
      caso X
      caso Y
      ...mas casos...
   fin casos
fin funcion

funcion ProcesarBateria(byte valor)
   entero k
   string mensaje
   ConstantesDeBateria cb

   cb= 1
   bucle para k desde 0 hasta 7
       si TestBit(valor, cb)
           escribirmensaje = mensajeBateriaOK(k) + ...quizás algun valor
       sino
          escribirmensaje = mensajeBateriaNO(k) + ...quizás algun valor
       fin si
        cb = (cb * 2)  ' pasará por los valores: 1,2,4,8,16...128
   siguiente
fin funcion

buleano = funcion TestBit(byte valor, byte Bit)
  devolver (valor and Bit)
fin funcion


Eso de '+ ...quizás algun valor', es para recordarte la respuesta de otro día que trataba sobre concatenar cadenas complejas con valores parametrizables en medio (¿recuerdas?)...

Es solo pasarlo a código y 'ampliar' la oferta de los comandos...
Si es otra cosa lo que pides, me temos que tendrás que expresarte con más claridad.