Está en la página 1de 18

Actividad 4:

Desarrollar las acciones que representen la estructura de un lenguaje de


programacin de alto nivel en un cdigo intermedio.
Cdigo intermedio.
De acuerdo con la clase de cdigo intermedio (por ejemplo, cdigo de tres
direcciones o cdigo P) y de las clases de optimizaciones realizadas, este cdigo
puede conservarse como un arreglo de cadenas de texto, un archivo de texto
temporal o bien una lista de estructuras ligadas. En los compiladores que realizan
optimizaciones complejas debe ponerse particular atencin a la seleccin de
representaciones que permitan una fcil reorganizacin.
Generacin de cdigo intermedio
Despus de los anlisis sintctico y semntico, algunos compiladores generan una
representacin intermedia explcita del programa fuente. Se puede considerar esta
representacin intermedia como un programa para una mquina abstracta. Esta
representacin intermedia debe tener dos propiedades importantes; debe ser fcil
de producir y fcil de traducir al programa objeto.
La representacin intermedia puede tener diversas formas. Existe una forma
intermedia llamada cdigo de tres direcciones, que es como el lenguaje
ensamblador para una mquina en la que cada posicin de memoria puede actuar
como un registro. El cdigo de tres direcciones consiste en una secuencia de
instrucciones, cada una de las cuales tiene como mximo tres operandos. El
programa fuente de (1) puede aparecer en cdigo de tres direcciones como
temp1 := entreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3

===> (2)

Esta representacin intermedia tiene varias propiedades.


Primera, cada instruccin de tres direcciones tiene a lo sumo un operador, adems
de la asignacin. Por tanto, cuando se generan esas instrucciones el compilador
tiene que decidir el orden en que deben efectuarse, las operaciones; la
multiplicacin precede a la adicin al programa fuente de.
Segunda, el compilador debe generar un nombre temporal para guardar los
valores calculados por cada instruccin.

Tercera, algunas instrucciones de tres direcciones tienen menos de tres


operadores, por ejemplo la primera y las ltimas instrucciones de asignacin.

Ejemplo1.sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace cadena_expresion
{
class Program
{
static void Main(string[] args)
{
analizaFichero();
}
static public void analizaFichero()
{
string[] Cadenas= {"Aplastar","Haragan","Encargado","Seleccion"};
string sexpresion;
Console.Write("Escribir expresion: ");
sexpresion = Console.ReadLine();
foreach (string s in Cadenas)
{
//System.Console.Write("{0,24}", s);
if (Regex.IsMatch(s, sexpresion))
{
System.Console.WriteLine("Existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
else
{
System.Console.WriteLine("No existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
Console.ReadLine();
}
}
}
}

Ejemplo 2.using System;


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace cadena_expresion
{
class Program
{
static void Main(string[] args)
{
analizaFichero();
}
static public void analizaFichero()
{
string[] Cadenas= {"Aplastar","Haragan","Encargado","Seleccion"};
string sexpresion;
Console.Write("Escribir expresion: ");
sexpresion = Console.ReadLine();
foreach (string s in Cadenas)
{
//System.Console.Write("{0,24}", s);
if (Regex.IsMatch(s, sexpresion))
{
System.Console.WriteLine("Existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
else

{
System.Console.WriteLine("No existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
Console.ReadLine();
}
}

}
}

Ejemplo3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace cadena_expresion
{
class Program
{
static void Main(string[] args)
{
analizaFichero();
}
static public void analizaFichero()
{

string[] Cadenas= {"Aplastar","Haragan","Encargado","Seleccion"};


string sexpresion;
Console.Write("Escribir expresion: ");
sexpresion = Console.ReadLine();
foreach (string s in Cadenas)
{
//System.Console.Write("{0,24}", s);
if (Regex.IsMatch(s, sexpresion))
{
System.Console.WriteLine("Existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
else
{
System.Console.WriteLine("No existe coincidencia '{0}' en: '{1}'",
sexpresion, s);
}
Console.ReadLine();
}
}
}
}

Actividad 5:
Aplicar las acciones construidas a la gramtica del lenguaje prototipo.
Las primeras versiones de los programas suelen ser incorrectas, y un buen
compilador debera ayudar al programador a identificar y localizar errores. Es ms,
considerar desde el principio el manejo de errores puede simplificar la estructura
de un compilador y mejorar su respuesta a los errores.
Los errores en la programacin pueden ser de los siguientes tipos:

Lxicos, producidos al escribir mal un identificador, una palabra clave o un


operador.
Sintcticos, por una expresin aritmtica o parntesis no equilibrados.
Semnticos, como un operador aplicado a un operando incompatible.
Lgicos, puede ser una llamada infinitamente recursiva.
De correccin, cuando el programa no hace lo que el programador
realmente deseaba.

Muchos errores de naturaleza sintctica Recuperacin: Al producirse un error el


compilador debe ser capaz de informar del error y seguir compilando. (Ideal).
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de
la creacin de compiladores. Nos interesa que cuando el compilador encuentre un
error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de
un analizador sintctico debe tener como objetivos:

Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su


localizacin.

Recuperarse del error, para poder seguir examinando la entrada.

No ralentizar significativamente la compilacin.

Un buen compilador debe hacerse siempre teniendo tambin en mente los


errores que se pueden producir; con ello se consigue:

Simplificar la estructura del compilador.

Mejorar la respuesta ante los errores.

Ejemplo 1.using System;


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace diagrama
{
class Program
{
static void Main(string[] args)
{
string cadena, sentencia = "", sentencia2 = "", sentencia3 = "";
int tamcad, tamcad2, tamcad3;
Console.Write("Ingresa la primera sentencia: ");
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino = new char[tamcad];
cadena.CopyTo(0, destino, 0, tamcad);//Copia la cadena y la almacena en
un arreglo
Console.Write("\nIngresa la segunda sentencia: ");
cadena = Console.ReadLine();
tamcad2 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino2 = new char[tamcad2];
cadena.CopyTo(0, destino2, 0, tamcad2);//Copia la cadena y la almacena
en un arreglo
Console.Write("\nIngresa la tercera sentencia: ");
cadena = Console.ReadLine();
tamcad3 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino3 = new char[tamcad3];
cadena.CopyTo(0, destino3, 0, tamcad3);//Copia la cadena y la almacena
en un arreglo
if(destino[tamcad - 1] == ';')
{
if(destino[0] == 'i' || destino2[0] == 'i' || destino3[0] == 'i')
{
if(destino[0] == 'i')
{
for (int i = 4; i < tamcad - 1; i++)
{

sentencia = sentencia + destino[i];


}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia);
}
if (destino2[0] == 'i')
{
for (int i = 4; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia2);
}
if (destino3[0] == 'i')
{
for (int i = 4; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia3);
}
}
if (destino[0] == 'f' || destino2[0] == 'f' || destino3[0] == 'f')
{
if (destino[0] == 'f')
{
for (int i = 6; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia);
}
if(destino2[0] == 'f')
{
for (int i = 6; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia2);
}
if(destino3[0] == 'f')
{
for (int i = 6; i < tamcad3 - 1; i++)

{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia3);
}
}

if (destino[0] == 'b' || destino2[0] == 'b' || destino3[0] == 'b')


{
if (destino[0] == 'b')
{
for (int i = 8; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia);
}
if (destino2[0] == 'b')
{
for (int i = 8; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia2);
}
if (destino3[0] == 'b')
{
for (int i = 8; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia3);
}
}
if (destino[0] == 'c' || destino2[0] == 'c' || destino3[0] == 'c')
{
if (destino[0] == 'c')
{
for (int i = 5; i < tamcad - 1; i++)

{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia);
}
if (destino2[0] == 'c')
{
for (int i = 5; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia2);
}
if (destino3[0] == 'c')
{
for (int i = 5; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia3);
}
}
}
else
{
Console.WriteLine("\nA esta sentencia le falta el ;. Intente de nuevo mas
tarde.");
}
Console.ReadLine();
}
}
}

EJEMPLO 2.using System;


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace diagrama
{
class Program
{
static void Main(string[] args)
{
string cadena, sentencia = "", sentencia2 = "", sentencia3 = "";
int tamcad, tamcad2, tamcad3;
Console.Write("Ingresa la primera sentencia: ");
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino = new char[tamcad];
cadena.CopyTo(0, destino, 0, tamcad);//Copia la cadena y la almacena en
un arreglo
Console.Write("\nIngresa la segunda sentencia: ");
cadena = Console.ReadLine();
tamcad2 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino2 = new char[tamcad2];
cadena.CopyTo(0, destino2, 0, tamcad2);//Copia la cadena y la almacena
en un arreglo
Console.Write("\nIngresa la tercera sentencia: ");
cadena = Console.ReadLine();
tamcad3 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino3 = new char[tamcad3];
cadena.CopyTo(0, destino3, 0, tamcad3);//Copia la cadena y la almacena
en un arreglo
if(destino[tamcad - 1] == ';')
{
if(destino[0] == 'i' || destino2[0] == 'i' || destino3[0] == 'i')
{
if(destino[0] == 'i')
{
for (int i = 4; i < tamcad - 1; i++)
{

sentencia = sentencia + destino[i];


}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia);
}
if (destino2[0] == 'i')
{
for (int i = 4; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia2);
}
if (destino3[0] == 'i')
{
for (int i = 4; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia3);
}
}
if (destino[0] == 'f' || destino2[0] == 'f' || destino3[0] == 'f')
{
if (destino[0] == 'f')
{
for (int i = 6; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia);
}
if(destino2[0] == 'f')
{
for (int i = 6; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia2);
}
if(destino3[0] == 'f')
{
for (int i = 6; i < tamcad3 - 1; i++)

{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia3);
}
}

if (destino[0] == 'b' || destino2[0] == 'b' || destino3[0] == 'b')


{
if (destino[0] == 'b')
{
for (int i = 8; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia);
}
if (destino2[0] == 'b')
{
for (int i = 8; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia2);
}
if (destino3[0] == 'b')
{
for (int i = 8; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia3);
}
}
if (destino[0] == 'c' || destino2[0] == 'c' || destino3[0] == 'c')
{
if (destino[0] == 'c')
{
for (int i = 5; i < tamcad - 1; i++)

{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia);
}
if (destino2[0] == 'c')
{
for (int i = 5; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia2);
}
if (destino3[0] == 'c')
{
for (int i = 5; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia3);
}
}
}
else
{
Console.WriteLine("\nA esta sentencia le falta el ;. Intente de nuevo mas
tarde.");
}
Console.ReadLine();
}
}
}

Ejemplo 3.using System;


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace diagrama
{
class Program
{
static void Main(string[] args)
{
string cadena, sentencia = "", sentencia2 = "", sentencia3 = "";
int tamcad, tamcad2, tamcad3;
Console.Write("Ingresa la primera sentencia: ");
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino = new char[tamcad];
cadena.CopyTo(0, destino, 0, tamcad);//Copia la cadena y la almacena en
un arreglo
Console.Write("\nIngresa la segunda sentencia: ");
cadena = Console.ReadLine();
tamcad2 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino2 = new char[tamcad2];
cadena.CopyTo(0, destino2, 0, tamcad2);//Copia la cadena y la almacena
en un arreglo
Console.Write("\nIngresa la tercera sentencia: ");
cadena = Console.ReadLine();
tamcad3 = cadena.Length;//Devuelve el tamao de la cadena
char[] destino3 = new char[tamcad3];
cadena.CopyTo(0, destino3, 0, tamcad3);//Copia la cadena y la almacena
en un arreglo
if(destino[tamcad - 1] == ';')
{
if(destino[0] == 'i' || destino2[0] == 'i' || destino3[0] == 'i')
{
if(destino[0] == 'i')
{
for (int i = 4; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];

}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia);
}
if (destino2[0] == 'i')
{
for (int i = 4; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia2);
}
if (destino3[0] == 'i')
{
for (int i = 4; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo int", sentencia3);
}
}
if (destino[0] == 'f' || destino2[0] == 'f' || destino3[0] == 'f')
{
if (destino[0] == 'f')
{
for (int i = 6; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia);
}
if(destino2[0] == 'f')
{
for (int i = 6; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia2);
}
if(destino3[0] == 'f')
{
for (int i = 6; i < tamcad3 - 1; i++)
{

sentencia3 = sentencia3 + destino3[i];


}
Console.WriteLine("\nLa sentencia {0} es de tipo float", sentencia3);
}
}

if (destino[0] == 'b' || destino2[0] == 'b' || destino3[0] == 'b')


{
if (destino[0] == 'b')
{
for (int i = 8; i < tamcad - 1; i++)
{
sentencia = sentencia + destino[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia);
}
if (destino2[0] == 'b')
{
for (int i = 8; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia2);
}
if (destino3[0] == 'b')
{
for (int i = 8; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo booleano",
sentencia3);
}
}
if (destino[0] == 'c' || destino2[0] == 'c' || destino3[0] == 'c')
{
if (destino[0] == 'c')
{
for (int i = 5; i < tamcad - 1; i++)
{

sentencia = sentencia + destino[i];


}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia);
}
if (destino2[0] == 'c')
{
for (int i = 5; i < tamcad2 - 1; i++)
{
sentencia2 = sentencia2 + destino2[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia2);
}
if (destino3[0] == 'c')
{
for (int i = 5; i < tamcad3 - 1; i++)
{
sentencia3 = sentencia3 + destino3[i];
}
Console.WriteLine("\nLa sentencia {0} es de tipo char", sentencia3);
}
}
}
else
{
Console.WriteLine("\nA esta sentencia le falta el ;. Intente de nuevo mas
tarde.");
}
Console.ReadLine();
}
}
}

También podría gustarte