You are on page 1of 9

ESCUELA POLITCNICA NACIONAL

Facultad de Ingeniera en Sistemas y de


Computacin
Materia: [Compiladores y Lenguajes]
Cdigo: [SIC-424]
Grupo: [GR2]
Tema: [Informe del Primer Bimestre]
Informe
Grupo de Trabajo Nro 4
Integrantes:
Wilmer Guevara
Santiago Pazmio
Jaime Yerovi
Fecha de Entrega: [26 de mayo de 2015]
Perodo Lectivo: [Abril/2015 Septiembre/2015]

CROSS ASSEMBLER
Objetivo(s)

Conocer los principios bsicos de un analizador lxico y sintctico y aplicarlo


en el problema.
Realizar la implementacin de una mquina de estado finita

Marco Terico
Un lenguaje ensamblador (o ensamblador de idioma ] ) es un lenguaje de
bajo nivel de programacin para un ordenador u otro dispositivo programable,
en el que hay una muy fuerte (en general, de uno a uno ) la correspondencia
entre el lenguaje y el de la arquitectura de la mquina cdigo
de instrucciones . Cada lenguaje ensamblador es especfico de una
arquitectura de computadora en particular, en contraste con la mayora de
los lenguajes de programacin de alto nivel , que son generalmente porttil a
travs de mltiples arquitecturas, pero requieren de
interpretacin o compilacin .
El lenguaje ensamblador se convierte en cdigo mquina ejecutable por
un programa de utilidad que se refiere como un ensamblador; el proceso de
conversin se conoce como montaje o ensamblaje el cdigo.
Lenguaje Maquina: depende de la arquitectura de la maquina; es
interpretado por el hardware o por microprogramas propios de la mquina.
Lenguajes de Alto Nivel: son de ms fcil programacin y menos
dependientes del sistema, por el contrario sus programas terminan siendo ms
lentos y consumen ms recursos.
Analizador Lxico: el analizador lxico o tambin denominado escner, es la
primera fase de procesamiento de un compilador. Este toma como entrada un
archivo escrito en algn lenguaje de programacin y da como salida
compuesta por tokens para que sean analizados por la caja sintctica.
Analizador Sintctico: el analizador sintctico o tambin llamado parser es el
encargado de la comprobacin de la estructura correcta del lenguaje.
Generalmente toma como entrada la salida del analizador lxico, produce un
rbol de derivacin, para su posterior anlisis.

Analizador Semntico: el anlisis semntico utiliza como entrada el rbol


sintctico detectado por el anlisis sintctico para comprobar restricciones de
tipo y otras limitaciones semnticas y preparar la generacin de cdigo.
En compiladores de un solo paso, las llamadas a las rutinas semnticas se
realizan directamente desde el analizador sintctico y son dichas rutinas las
que llaman al generador de cdigo. El instrumento ms utilizado para
conseguirlo es la gramtica de atributos.

CODIFICACION
#include
#include
#include
#include
#include
#include

<iostream>
<fstream>
<cstring>
<sstream>
<vector>
<string>

using namespace std;


int main(void)
{
ifstream inData("entrada.txt");
string line[100];
signed int contador = 0;
int list_size=0;
while(!inData.eof())
{

getline(inData, line[contador]);
cout << line[contador++] << endl;
list_size++;
}
inData.close();
//Separamos las palabras de cada linea en tokens
string ventas[list_size];
string ventas2[list_size];
string bytes[list_size];
string sep[list_size];
for(int j = 0; j<list_size;j++)
{
int i=0;
istringstream s(line[j]);
string token;
while( s >> token )
{
sep[i]=token;
i++;

}
if(i!=2)
{
ventas[j]=sep[0];
ventas2[j]= "$0";
bytes[j] = "1";
}
else
{
ventas[j]=sep[0];
ventas2[j]=sep[1];
bytes[j] = "2";
}
cout<<ventas[j]<<endl;
}
bytes[0]="0";

string ventas2n[list_size];
string sep2[list_size];
for(int j = 0; j<list_size;j++)
{
int i=0;
istringstream s(ventas2[j]);
string token;
while( getline(s, token, '$'))
{
sep2[i]=token;
//cout<<sep2[i]<<endl;
//cout<<i<<endl;

i++;
}
ventas2n[j]=sep2[1];
cout<<ventas2n[j]<<endl;
}
int a=100;
stringstream ss;
ss<<hex<<a;
string r = ss.str();
cout<<a<<endl;
cout<<r<<endl;

//Convertimos de string a int para poder oredenar despues


int val_operando[list_size];
for(int j = 0; j<list_size;j++)
{
val_operando[j]=atoi(ventas2n[j].c_str());
cout<<val_operando[j]<<endl;
}

string operando[list_size];
for(int j = 0; j<list_size;j++)
{
stringstream xx;
xx<<hex<<val_operando[j];
operando[j] = xx.str();
cout<<operando[j]<<endl;
}

ifstream inData2("cdigo operacion.txt");


string line2[100];
signed int contador2 = 0;
int tab_size=0;
while(!inData2.eof())
{
getline(inData2, line2[contador2]);
cout << line2[contador2++] << endl;
tab_size++;
}
inData2.close();
string tabla[list_size];
string tabhex[list_size];
string sep3[list_size];
for(int j = 0; j<tab_size;j++)
{

int k=0;
istringstream t(line2[j]);
string token;

while(getline(t, token, ' '))


{
sep3[k]=token;
//cout<<sep3[k]<<endl;
//cout<<i<<endl;
k++;
}
tabla[j]=sep3[0];
tabhex[j]=sep3[1];
cout<<tabla[j]<<endl;
cout<<tabhex[j]<<endl;

string cod_oper[list_size];
for(int j = 0; j<list_size;j++)
{
for(int k=0; k<(list_size);k++)
{
if (line[k].find(tabla[j]) != string::npos)
{
cod_oper[j]=tabhex[j];
}
}
cout<<cod_oper[j]<<endl;
}
string operando1[list_size];
for(int j = 0; j<list_size;j++)
{
for(int k=1; k<(list_size);k++)
{
if (line[k].find(ventas2n[j]) != string::npos)
{
operando1[j]=operando[j];
}
}
}
string toperando[list_size];
int y=1;
for(int j = 0; j<list_size-1;j++)
{
toperando[j] = operando1[y];
y++;
cout<<toperando[j]<<endl;
}
int memoria[list_size];
int sumbytes[list_size];
int inicial = val_operando[0];
for(int j = 0; j<list_size;j++)
{
sumbytes[j]=atoi(bytes[j].c_str());

}
for(int j = 0; j<list_size;j++)
{
inicial = inicial + sumbytes[j];
memoria[j]= inicial;
}
string memoria2[list_size];
for(int j = 0; j<list_size;j++)
{
stringstream zz;
zz<<hex<<memoria[j];
memoria2[j] = zz.str();
cout<<memoria2[j]<<endl;
}
string cod_maquina[list_size];
for(int j = 0; j<list_size-1;j++)
{
cod_maquina[j]= cod_oper[j] + " " + toperando[j];
cout<<cod_maquina[j]<<endl;
}
string line_mod[list_size];
int z=1;
for(int j = 0; j<list_size-1;j++)
{
line_mod[j] = line[z];
z++;
cout<<line_mod[j]<<endl;
}
string final[list_size];
for(int j = 0; j<list_size-1;j++)
{
final[j]= memoria2[j] + " " + cod_maquina[j] + " " + line_mod[j];
cout<<final[j]<<endl;
}
string final2[list_size];
for(int j = 0; j<list_size-1;j++)
{
if(j==2 || j==4 || j==5)
{
final2[j]= line_mod[j] + "\t\t " + final[j];
cout<<final2[j]<<endl;
}
else
{
final2[j]= line_mod[j] + "\t " + final[j];
cout<<final2[j]<<endl;

ofstream Exit("salida.txt");
Exit<<line[0]<<endl;
for(int j = 0; j<list_size-1;j++)
{
Exit<<final2[j]<<endl;
}
Exit.close();
system("pause");
return 0;
}

EJECUCION DEL PROGRAMA


TENEMOS DE ENTRADA EL SIGUIENTE ARCHIVO PLANO

COMPARAMOS CON EL CODIGO DE OPERACIN

Y tenemos como salida

Conclusiones

1. Pudimos comprobar que aunque implementamos solo una parte de lo que es en


realidad el compilador nos dimos cuenta que es un procedimiento muy complicado
y que lleva mucho tiempo realizarlo.
2. Cada una de las etapas para construir un compilador tiene una funcin especfica y
es muy necesaria para el desarrollo.
3. En este proyecto hemos implementado principalmente el analizador lexicogrfico
que separa una cadena de caracteres en tokens.

Recomendaciones

1. Conocer cada una de las etapas que son necesarias para realizar un compilador para
poder implementarlo.

Bibliografa

A. Aho and J. Ullman,(1990) Compiladores:Principios, Tcnicas y Herramientas,


2ma ed.

You might also like