elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 23:36  


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General (Moderador: Littlehorse)
| | |-+  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 492 veces)
Leo Gutiérrez.
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 2.968


/^$/


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

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 por Leo Gutiérrez. » En línea

Código
(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}
 

leorocko13@hotmail.com
https://github.com/leogtzr/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
KPL - El lenguaje de programación para niños
Programación General
JuszR 0 501 Último mensaje 10 Mayo 2006, 23:11
por JuszR
Que Lenguaje de programación para Linux « 1 2 3 4 5 »
Programación C/C++
calivent 66 5,965 Último mensaje 24 Diciembre 2008, 08:09
por Sin Nick xD
que lenguaje de programacion es mejor para iniciar??
Programación General
dandy_hack 6 1,798 Último mensaje 10 Agosto 2011, 10:14
por R/G
Lenguaje de programación para ejecutables « 1 2 »
Programación General
kurotenshi 21 1,679 Último mensaje 10 Diciembre 2011, 19:24
por [Case]
¿Dónde consigo algún compilador para el lenguaje PASCAL?
Programación General
theluigy13etv 1 366 Último mensaje 29 Diciembre 2011, 23:52
por RakNae
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines