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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Un compilador para un lenguaje de programación sencillo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Un compilador para un lenguaje de programación sencillo  (Leído 18,587 veces)
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Un compilador para un lenguaje de programación sencillo
« en: 8 Enero 2012, 05:57 am »

Hola a todos.

Hola a todos, bueno, les cuento, como parte de un trabajo en la universidad, tuve que crear un "compilador", o por lo menos avanzarlo, sin utilizar flex, lex, bison, yacc y todo eso, desde 0 totalmente. Pues bueno, quería compartirles el código.

El compilador no tiene mucho, pero algo es algo  :P

Tiene su analizador léxico, analizador sintáctico, unas pequeñas comprobaciones de tipos de datos y demás..., el compilador crea correctamente su propio árbol sintáctico para el código fuente dado, que ya es un avance, y para ver si funcionaba la lectura del árbol sintáctico, hice un poco de generación de código intermedio para las expresiones aritméticas básicas, genera código P y pseudocódigo ensamblador (un código artesanal que hace movimientos con registros con nombres de tipo R[0-9]), pero solo para expresiones aritméticas sencillas.

Quiero compartirlos con ustedes y si quieren unirse a mi, adelante, son bienvenidos, ya que creanme que para mi no ha sido nada fácil, me ha resultado bastante complejo esto, y eso que aún no llego plenamente a la generación de código. En fin.

El "compilador" está hecho en Java, con la ayuda de NetBeans. ¿por qué en Java? porque tenía que hacer esto lo más pronto posible, en menos de 3 meses :s y en periodo escolar, por lo que no tenía mucho tiempo de dedicarle tiempo exclusivamente a esto :s, Java provee un fácil manejo con Strings, además de estructuras de datos que no iba a tener que armas desde 0, como las listas y las tablas de dispersión, además que es con lo que más se llevan mis compañeros.

Bueno, les comento un poco cómo se estructura el lenguaje, algunos ejemplos:

Código:
inicio miPrimerProgramaEnGLHBR
entero x = 3;
leer(x)
fin;

El código debe empezar por inicio ID sentencias fin;, siempre.

Código:
inicio Hello_Shit
entero x = 123;
inc(x, 2 * 3)
fin;

Código:
inicio X
entero x = 1;
write(x);
repetir
x = x + 5;
x = x - 4
hasta x == 10
fin;

Código:
inicio X
entero z = 1234 + 234 + 56 + 78;
infinito hacer
z = z + 12
porsiempre
fin;

El compilador procesa las operaciones aritméticas (obviamente las operaciones aritméticas se hacen checando precedencia de operadores) y hace el cálculo, por ejemplo esto:

Código:
inicio X
entero x = (3 * 69 - (5 * 85 - 14))
fin;

Y el código que se genera:

Código P:

Código:
;Código P para las sentencias enteras sencilla para el programa final.glhbr
ldc 3
ldc 69
mpi
ldc 5
ldc 85
mpi
ldc 14
sbi
sbi

Y el pseudocódigo ensamblador:

Código:
; Código ensamblador para el programa "final.glhbr"
MOV R0,#3 ; Cargamos 3
MOV R1,#69 ; Cargamos 69
MUL R0,R1     ;  Multiplicamos
MOV R1,#5 ; Cargamos 5
MOV R2,#85 ; Cargamos 85
MUL R1,R2     ;  Multiplicamos
MOV R2,#14 ; Cargamos 14
SUB R1,R2        ; Restamos
SUB R0,R1        ; Restamos
MOV x,R0    ; fin de la sentencia de asignación
; Rutina para mostrar el resultado de x
;        R = -204.0

Todo esto recorriendo el nodo de árbol sintáctico correspondiente a una operación aritmética en postorden y luego la evaluación por medio de una pila.

Quizá alguien que sepa assembly pueda ayudar a traducir el pseudocódigo ensamblador a assembly real.

Son algunos de los usos, por supuesto, como ya les he dicho, no se ejecuta nada, porque no hay generación de código.... y para eso pido su ayuda, si alguno quiere unirse y aportar ideas, bienvenido! así aprendemos todos.

Bueno, les dejo el link el link y una captura:



El proyecto está en github por si quieren ver ahí los cambios que he hecho:
https://github.com/leogtzr/glhbr

Saludos.


« Última modificación: 8 Enero 2012, 20:00 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
WARG

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Un compilador para un lenguaje de programación sencillo
« Respuesta #1 en: 7 Septiembre 2013, 06:54 am »

viejo me gustaria ayudarte ya que tengo una idea similar para mi propuesta de grado a esta no tengo mucho conocimiento en esto pero estoy investigando mucho me gusta esto que estas haciendo ATT WARG


En línea

WarZ0n3

Desconectado Desconectado

Mensajes: 22


Ver Perfil
Re: Un compilador para un lenguaje de programación sencillo
« Respuesta #2 en: 7 Septiembre 2013, 08:57 am »

EDITO: No me había fijado que era un post muerto de hace 1 año ¬¬

Voy a dar 3 simples ejemplo 2 de suma y 1 de resta (con la sintaxis de AT&T), por que la idea no es traducir el pseudocódigo si no que entiendas el concepto de suma/resta y luego tomar las acciones respectivas dependiendo de lo que quieras hacer...

También quería aclarar que hace mucho que no hago nada en ASM puro, por lo que los siguientes ejemplos los daré del lado del GCC pero si entiendes la mecánica luego podrás adaptarlo a intel o cualquier otro asm fácilmente...

(todo esto suponiendo que tiene una variable "x" de tipo integro en 0)
AT&T (suma con asm extendido "x"+15)
Código
  1. __asm__(
  2.        "StartUp:\n"
  3.        "lea 0xfffffffc(%%ebp), %%eax\n" //cargamos la variable con el puntero a ebp -4
  4.  
  5.        :"=r"(x) // output de la variable
  6.        :"r"(15) // sumamos 15 desde el input
  7.        :"%eax" // preservamos el registro eax
  8.    );
  9.  

AT&T (suma normal "x"+3)
Código
  1. __asm__(
  2.        "StartUp:\n"
  3.        "lea 0xfffffffc(%ebp), %eax\n"
  4.        "addl $0x3, (%eax)" // sumamos 3 a eax
  5. );
  6.  

AT&T (resta normal "x"-3)
Código
  1. __asm__(
  2.        "StartUp:\n"
  3.        "lea 0xfffffffc(%ebp), %eax\n"
  4.        "subl $0x3, (%eax)\n"
  5.    );
  6.  



Espero que te haya servido yo también sigo estudiando at&t
« Última modificación: 7 Septiembre 2013, 10:14 am por WarZ0n3 » En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Un compilador para un lenguaje de programación sencillo
« Respuesta #3 en: 27 Septiembre 2013, 23:06 pm »

@WarZ0n3

Gracias, la verdad que este proyecto lo descontinué hace muchísimo.

Continué con un nuevo proyecto, un lenguaje de programación ya terminado, te dejo más información aquí.

http://leonardogtzr.wordpress.com/2013/03/09/yare-un-lenguaje-de-programacin-propio/
https://github.com/leogtzr/yarelang-c--
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Lenguaje o libs para programación rápida en linux.
Programación General
16BITBoy 2 2,221 Último mensaje 21 Junio 2010, 23:46 pm
por @synthesize
que lenguaje de programacion es mejor para iniciar??
Programación General
dandy_hack 6 5,248 Último mensaje 10 Agosto 2011, 10:14 am
por R/G
Lenguaje de programación para ejecutables « 1 2 3 »
Programación General
kurotenshi 21 11,705 Último mensaje 10 Diciembre 2011, 19:24 pm
por [Case]
¿Dónde consigo algún compilador para el lenguaje PASCAL?
Programación General
theluigy13etv 1 1,820 Último mensaje 29 Diciembre 2011, 23:52 pm
por RakNae
Para que sirve el Lenguaje de Programacion Android?
Android
gonzalo57 3 5,960 Último mensaje 11 Junio 2012, 00:21 am
por #!drvy
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines