Pasos para ejecutar el compilador tiny 1) Instalar el “Xcode Tools” para Mac, que viene en el DVD de instalación “Mac OS X”. 2) Descargar de la página web http://www.cs.sjsu.edu/~louden/cmptext/ el archivo “loucomp.tar.z “. 3) Descomprimir el archivo que se descargo, el cual contiene el código fuente del compilador. 4) Entrar al directorio “loucomp”. 5) Compilar los archivos fuente del compilador, a través del comando MAKE, el cual debe teclearse en el promp dentro del directorio. El comando MAKE, ejecuta los comandos e instrucciones contenidas en el archivo makefile, que en nuestro caso contiene las instrucciones para compilar con gcc cada uno de los archivos fuentes del programa. 6) El comando MAKE genera un archivo ejecutable de nombre tiny.exe. Este archivo permite compilar un programa (codigo fuente) con el nuevo compilador (tiny). Por lo que en nuestro caso teclearemos en el promp: ./tiny sample.tny. 7) El compilador tiny genera un archivo con extensión tm (sample.tm), el cual contiene las instrucciones que el programa que compiló va a llevar a cabo. Cabe mencionar que estas instrucciones están en lenguaje ensamblador. 8) Para poder ejecutar el programa que se compiló, es necesario contar con un programa que traduzca las instrucciones del lenguaje ensamblador, para ello está el programa TM. Es necesario compilarlo para ello introducimos la siguiente instrucción desde el promp: gcc tm.c –o tm. 9) El archivo resultante (tm) nos permitira traducir las instrucciones en lenguaje ensamblador, para ello se utiliza la siguiente instrucción: ./tm sample.tm. 10) TM ejecutará las instrucciones del programa (sample.tny) que tiny compilo. Cabe mencionar que es necesario seguir las instrucciones que tiene el programa compilado, para nuestro caso (en sample.tny) se tienen las instrucciones para calcular el factorial de un número. Para poder introducir el número a calcular, primero debemos presionar enter, después introducir el comando “go + enter” y después el número (y enter) al que deseamos calcular su factorial; posteriormente se desplegara el resultado. Finalmente es necesario teclear el comando “quit + enter” para poder salir del programa. COMPILADOR Documents nicandrocruzramirez$ cd loucomp loucomp nicandrocruzramirez$ ls Makefile cgen.o main.c sample.tny symtab.o analyze.c code.c main.o scan.c tm.c analyze.h code.h parse.c scan.h util.c analyze.o code.o parse.h scan.o util.h cgen.c globals.h parse.o symtab.c util.o cgen.h lex readme.unx symtab.h yacc l oucomp nicandrocruzramirez$ MAKE gcc ‐c main.c gcc main.o util.o scan.o parse.o symtab.o analyze.o code.o cgen.o ‐o tiny loucomp nicandrocruzramirez$ ls Makefile code.c parse.c scan.o util.h analyze.c code.h parse.h symtab.c util.o analyze.h code.o parse.o symtab.h yacc analyze.o globals.h readme.unx symtab.o cgen.c lex sample.tny tiny cgen.h main.c scan.c tm.c cgen.o main.o scan.h util.c loucomp nicandrocruzramirez$ ./tiny sample.tny TINY COMPILATION: sample.tny loucomp nicandrocruzramirez$ gcc tm.c ‐o tm loucomp nicandrocruzramirez$ ls Makefile code.c parse.c scan.h analyze.c code.h parse.h scan.o analyze.h code.o parse.o symtab.c analyze.o globals.h readme.unx symtab.h cgen.c lex sample.tm symtab.o cgen.h main.c sample.tny tiny cgen.o main.o scan.c tm tm.c util.c util.h util.o yacc loucomp nicandrocruzramirez$ ./tm sample.tm TM simulation (enter h for help)... Enter command: warning: this program uses gets(), which is unsafe. Enter command: go Enter value for IN instruction: 5 OUT instruction prints: 120 HALT: 0,0,0 Halted Enter command: quit Simulation done. loucomp nicandrocruzramirez$ Para poder obtener el analizador léxico del compilador Tiny es necesario llevar a cabo las siguientes instrucciones: 1) Cambiar el valor de las banderas (de FALSO a VERDADERO) que corresponden al analizador léxico en el programa MAIN.C, las cuales son: int EchoSource = TRUE; int TraceScan = TRUE; 2) Guardar los cambios efectuados al archivo MAIN.C. 3) Ejecutar nuevamente el comando MAKE 4) Correr con el compilador tiny el programa que deseado: ./tiny sample.tny 5) En pantalla tiny desplegara el analizador léxico correspondiente. Para poder obtener el analizador sintáctico del compilador Tiny es necesario llevar a cabo las siguientes instrucciones: 1) Cambiar el valor de las banderas (de FALSO a VERDADERO) que corresponden al analizador sintáctico en el programa MAIN.C, las cuales son: int TraceParse = TRUE; 2) Guardar los cambios efectuados al archivo MAIN.C. 3) Ejecutar nuevamente el comando MAKE 4) Correr con el compilador tiny el programa que deseado: ./tiny sample.tny 5) En pantalla tiny desplegara el analizador sintáctico correspondiente. Para poder obtener el analizador semántico del compilador Tiny es necesario llevar a cabo las siguientes instrucciones: 1) Cambiar el valor de las banderas (de FALSO a VERDADERO) que corresponden al analizador semántico en el programa MAIN.C, las cuales son: int TraceAnalyze = TRUE; 2) Guardar los cambios efectuados al archivo MAIN.C. 3) Ejecutar nuevamente el comando MAKE 4) Correr con el compilador tiny el programa que deseado: ./tiny sample.tny 5) En pantalla tiny desplegara el analizador semántico correspondiente. ANALIZADOR LEXICO loucomp nicandrocruzramirez$ ./tiny sample.tny TINY COMPILATION: SAMPLE.TNY 1: { Sample program 2: in TINY language ‐ 3: computes factorial 4: } 5: read x; { input an integer } 5: reserved word: read 5: ID, name= x 5: ; 6: if 0 < x then { don't compute if x <= 0 } 6: reserved word: if 6: NUM, val= 0 6: < 6: ID, name= x 6: reserved word: then 7: fact := 1; 7: ID, name= fact 7: := 7: NUM, val= 1 7: ; 8: repeat 8: reserved word: repeat 9: fact := fact * x; 9: ID, name= fact 9: := 9: ID, name= fact 9: * 9: ID, name= x 9: ; 10: x := x ‐ 1 10: ID, name= x 10: := 10: ID, name= x 10: ‐ 10: NUM, val= 1 11: until x = 0; 11: reserved word: until 11: ID, name= x 11: = 11: NUM, val= 0 11: ; 12: write fact { output factorial of x } 12: reserved word: write 12: ID, name= fact 13: end 13: reserved word: end 14: EOF loucomp nicandrocruzramirez$ ANALIZADOR SINTACTICO loucomp nicandrocruzramirez$ ./tiny sample.tny TINY COMPILATION: SAMPLE.TNY Syntax tree: Read: x If Op: < Const: 0 Id: x Assign to: fact Const: 1 Repeat Assign to: fact Op: * Id: fact Id: x Assign to: x Op: ‐ Id: x Const: 1 Op: = Id: x Const: 0 Write Id: fact loucomp nicandrocruzramirez$ ANALIZADOR SEMANTICO loucomp nicandrocruzramirez$ ./tiny sample.tny TINY COMPILATION: SAMPLE.TNY Building Symbol Table... Symbol table: Variable Name Location Line Numbers ‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐ x 0 5 6 9 10 10 11 fact 1 7 9 9 12 Checking Types... Type Checking Finished loucomp nicandrocruzramirez$ Para la generación de código con el compilador Tiny es necesario llevar a cabo las siguientes instrucciones: 1) Cambiar el valor de la bandera (de FALSO a VERDADERO) que corresponden a la generación de código en el programa MAIN.C: int TraceCode = TRUE; 2) Guardar los cambios efectuados al archivo MAIN.C. 3) Ejecutar nuevamente el comando MAKE 4) Correr con el compilador tiny el programa que deseado: ./tiny sample.tny 5) En el archivo sample.tm se guardará el código que tiny generó con el programa sample.tny