Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Profesor:
Integrantes del equipo:
Nombre
Nmero de control
ndice
Contenido
Introduccin..................................................................................................... 3
Actividad 1........................................................................................................ 4
Aplicar los tipos de notacion para la conversion de expresiones: infija, prefija y
postfija............................................................................................................. 4
Actividad 2...................................................................................................... 18
Representar expresiones mediante el codigo intermedio...................................18
Actividad 3...................................................................................................... 26
Reconocer el manejo de tipos en las expresiones y el uso de operadores..........26
Actividad 4...................................................................................................... 49
Desarrollar las acciones que representen la estrucutra de un lenguaje de
programacion de alto nivel en un codigo intermedio.........................................49
Actividad 5...................................................................................................... 71
Aplicar las acciones construidas a la gramatica del lenguaje prototipo..............71
Actividad 6. ................................................................................................. 84
Integrar equipos de trabajo para la generacion de un codigo intermedio..........84
Actividad 7. ............................................................................................... 117
Avance del proyecto final.............................................................................117
Conclusin................................................................................................... 129
Bibliografa................................................................................................. 130
Introduccin
En la construccin de un compilador varios tipos de anlisis juegan un papel
bastante importante en esta unidad y en siguientes prcticas abordaremos un
Programa 1 utilizado:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace infijaposfijanuevo
{
static class Program
{
public static void Main(string[] args)
{
//string cadena = "(1+17)*2";
}
public static int DimeOperador(int p, int p_2, char p_3)
{
switch (p_3)
{
case '+':
return p_2 + p;
case '-':
return p_2 - p;
case '*':
return p_2 * p;
case '/':
return p_2 / p;
default:
return -1;
}
}
}
}
Ejemplo 1:
Programa 2 utilizado:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace infijaposfijanuevo
{
{
pila.Push(stringeninfijo[i]);
}
else if ((stringeninfijo[i] == '*') || (stringeninfijo[i] == '+') || (stringeninfijo[i]
== '-') || (stringeninfijo[i] == '/'))
{
while ((pila.Count > 0) && (pila.Peek() != '('))
{
if (precedenciadeoperadores(pila.Peek(), stringeninfijo[i]))
{
stringenposfijo.Append(pila.Pop());
}
else
{
break;
}
}
pila.Push(stringeninfijo[i]);
}
else if (stringeninfijo[i] == ')')
{
while ((pila.Count > 0) && (pila.Peek() != '('))
{
stringenposfijo.Append(pila.Pop());
}
if (pila.Count > 0)
9
10
return -1;
}
}
}
}
Ejemplo 2:
Programa 3 utilizado:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace infijaposfijanuevo
{
static class Program
{
public static void Main(string[] args)
{
12
{
while ((pila.Count > 0) && (pila.Peek() != '('))
{
if (precedenciadeoperadores(pila.Peek(), stringeninfijo[i]))
{
stringenposfijo.Append(pila.Pop());
}
else
{
break;
}
}
pila.Push(stringeninfijo[i]);
}
else if (stringeninfijo[i] == ')')
{
while ((pila.Count > 0) && (pila.Peek() != '('))
{
stringenposfijo.Append(pila.Pop());
}
if (pila.Count > 0)
pila.Pop(); //quita el parentesis izquierdo de la pila
}
}
while (pila.Count > 0)
14
{
stringenposfijo.Append(pila.Pop());
}
return stringenposfijo.ToString();
}
public static bool precedenciadeoperadores(char top, char p_2)
{
if (top == '+' && p_2 == '*') // + tiene menor precedencia que *
return false;
if (top == '*' && p_2 == '-') // * tiene mayor precedencia que return true;
if (top == '+' && p_2 == '-') // + tiene la misma precedencia que +
return true;
return true;
}
public static int EvaluarRes(string posfija)
{
Stack<int> pilaResultado = new Stack<int>();
int tama = posfija.Length;
for (int i = 0; i < tama; i++)
{
if ((posfija[i] == '*') || (posfija[i] == '+') || (posfija[i] == '-') || (posfija[i] == ' '))
{
int resz = DimeOperador(pilaResultado.Pop(), pilaResultado.Pop(),
posfija[i]);
pilaResultado.Push(resz);
15
}
else if ((posfija[i] >= '0') || (posfija[i] <= '9'))
{
pilaResultado.Push((int)(posfija[i] - '0'));
}
}
return pilaResultado.Pop();
}
public static int DimeOperador(int p, int p_2, char p_3)
{
switch (p_3)
{
case '+':
return p_2 + p;
case '-':
return p_2 - p;
case '*':
return p_2 * p;
case '/':
return p_2 / p;
default:
return -1;
}
}
}
16
Ejemplo 3:
17
namespace actividad2
{
class Program
{
static void Main(string[] args)
{
char[] letra = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
18
'P','Q','R','S','T','U','V','W','X','Y','Z'};
String cadena;
int tamcad, tamlet, m = 0;
char[] Tabla = new char[15];
tamlet = letra.Length;
Console.WriteLine(" _____________");
for(int k= 0; k < m; k++)
{
Console.WriteLine(" | <id,{0}>: {1} |", k, Tabla[k]);
}
Console.WriteLine(" _____________");
Console.ReadLine();
}
}
}
Ejemplo 1:
20
namespace actividad2
{
class Program
{
static void Main(string[] args)
{
char[] numero = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
String cadena;
int tamcad, tamnum, m = 0;
char[] Tabla = new char[15];
tamnum = numero.Length;
Tabla[m] = destino[i];
m = m + 1;
}
}
}
Console.ReadLine();
}
}
}
Ejemplo 2:
22
namespace actividad2
{
class Program
{
static void Main(string[] args)
{
char[] Oparit = { '+', '-', '*', '/', '=' };
String cadena;
int tamcad, tamOparit, m = 0;
char[] Tabla = new char[15];
tamOparit = Oparit.Length;
23
Console.ReadLine();
}
}
}
24
Ejemplo 3:
25
a
-a * 2 + b
-b + sqrt(b**2 - 4*a*c)
length(s) > 0
Las expresiones se evalan de acuerdo con la precedencia de los operadores.
Ante una secuencia de operadores de igual precedencia, la evaluacin se realiza
segn el orden de escritura, de izquierda a derecha. El orden de evaluacin puede
modificarse usando parntesis.
Operadores Principales:
Estos son los operadores de precedencia ms alta. Tenga en cuenta que puede
hacer clic en los operadores para ir a las pginas de detalles con ejemplos.
x.y: acceso a miembros.
x?.y: acceso a miembros condicional null. Devuelve null si el operando izquierdo
es null.
f(x): invocacin de funcin.
a[x]: indizacin de objeto agregado.
a?[x]: indizacin condicional null. Devuelve null si el operando izquierdo es null.
x++: incremento de postfijo. Devuelve el valor de x y, a continuacin, actualiza la
ubicacin de almacenamiento con el valor de x que es uno mayor (normalmente
agrega el entero 1).
x--: decremento de postfijo. Devuelve el valor de x; a continuacin, actualiza la
ubicacin de almacenamiento con el valor de x que es uno menos (normalmente
resta el entero 1).
New: creacin de instancias de tipo.
Typeof: devuelve el objeto System.Type que representa el operando.
Checked: habilita la comprobacin de desbordamiento para operaciones con
enteros.
Unchecked: deshabilita la comprobacin de desbordamiento para operaciones con
enteros. Este es el comportamiento predeterminado del compilador.
26
27
28
Este operador tiene mayor precedencia que el de la seccin siguiente y menor que
el de la anterior. Tenga en cuenta que puede hacer clic en el operador para ir a la
pgina de detalles con ejemplos.
x && y: AND lgico. Si el primer operando es false, C# no evala el segundo
operando.
Operador condicional OR
Este operador tiene mayor precedencia que el de la seccin siguiente y menor que
el de la anterior. Tenga en cuenta que puede hacer clic en el operador para ir a la
pgina de detalles con ejemplos.
x || y: OR lgico. Si el primer operando es true, C# no evala el segundo
operando.
Operador de uso combinado de null
Este operador tiene mayor precedencia que el de la seccin siguiente y menor que
el de la anterior. Tenga en cuenta que puede hacer clic en el operador para ir a la
pgina de detalles con ejemplos.
x ?? y: devuelve x si no es null; de lo contrario, devuelve y.
Operador condicional
Este operador tiene mayor precedencia que el de la seccin siguiente y menor que
el de la anterior. Tenga en cuenta que puede hacer clic en el operador para ir a la
pgina de detalles con ejemplos.
t ? x : y: si la prueba t es true, evala y devuelve x; en caso contrario, evala y
devuelve y.
Operadores de asignacin y Lambda
Estos operadores tienen mayor precedencia que los de la seccin siguiente y
menor que el de la anterior. Tenga en cuenta que puede hacer clic en los
operadores para ir a las pginas de detalles con ejemplos.
x = y: asignacin.
x += y: incremento. Agregue el valor de y al valor de x, almacene el resultado en x
y devuelva el nuevo valor. Si x designa un event, y debe ser una funcin
adecuada que C# agregue como un controlador de eventos.
30
Programa 1 utilizado
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Analizador
31
{
class Program
{
static void Main(string[] args)
{
//a32e23
String cadena, Dato;
int tamcad, tamlet, tamnum, tamOparit, tamOpeRe, tamOpeLog, m = 1,
Opcion;
float a = 5, b = 10, c = 15;
float Resultado = 0;
char[] letra = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W','X','Y','Z'};
char[] numero = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char[] Oparit = { '+', '-', '*', '/', '=' };
char[] OpeRe = { '<', '>', '!' };
char[] OpeLog = { '&', '|', '~' };
//Devuelve el tamao de la cadena
tamlet = letra.Length;
tamnum = numero.Length;
tamOparit = Oparit.Length;
tamOpeRe = OpeRe.Length;
tamOpeLog = OpeLog.Length;
Console.WriteLine("Que desea utilizar?");
Console.WriteLine("\n[1]Analizador Lexico");
Console.WriteLine("\n[2]Analizador Sintactico");
Console.Write("\nTu Opcion: ");
Dato = Console.ReadLine();
Opcion = Convert.ToInt32(Dato);
switch (Opcion)
{
case 1:
Console.WriteLine("\n\nAnalizador Lexico");
Console.Write("\nIngresa una expresion: ");
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino = new char[tamcad + 5];
32
| una letra
|",
destino[i]);
}
if (destino[i] == 'f')
{
if (destino[i] == 'f' && destino[i + 1] == 'o' && destino[i + 2]
== 'r')
{
Console.WriteLine("\n| {0}{1}{2}
|", destino[i], destino[i + 1], destino[i + 2]);
i = i + 2;
break;
}
else Console.WriteLine("\n| {0}
destino[i]);
}
if (destino[i] == 'd')
{
33
| palabra reservada
| una letra
|",
| una letra
|",
destino[i]);
}
if (destino[i] == 'w')
{
if (destino[i] == 'w' && destino[i + 1] == 'h' && destino[i +
2] == 'i' && destino[i + 3] == 'l' && destino[i + 4] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3}{4} | palabra
reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3], destino[i +
4]);
i = i + 4;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'c')
{
if (destino[i] == 'c' && destino[i + 1] == 'a' && destino[i + 2]
== 's' && destino[i + 3] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3} | palabra reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3]);
i = i + 3;
break;
}
else Console.WriteLine("\n| {0}
destino[i]);
}
if (destino[i] == 's')
34
| una letra
|",
{
if (destino[i] == 's' && destino[i + 1] == 'w' && destino[i +
2] == 'i' && destino[i + 3] == 't' && destino[i + 4] == 'c' && destino[i + 5] == 'h')
{
Console.WriteLine("\n| {0}{1}{2}{3}{4}{5} | palabra
reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3], destino[i + 4],
destino[i + 5]);
i = i + 5;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'e')
{
if (destino[i] == 'e' && destino[i + 1] == 'l' && destino[i + 2]
== 's' && destino[i + 3] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3} | palabra reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3]);
i = i + 4;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
}
//Nmeros
for (int j = 0; j < tamnum; j++)
{
if (destino[i] == numero[j])
{
Console.WriteLine("\n| {0}
destino[i]);
}
}
35
| un numero
|",
//Operadores aritmticos
for (int j = 0; j < tamOparit; j++)
{
if (destino[i] == Oparit[j])
{
Console.WriteLine("\n| {0}
destino[i]);
}
}
//Operadores lgicos
for (int j = 0; j < tamOpeLog; j++)
{
if (destino[i] == OpeLog[j])
{
Console.WriteLine("\n| {0}
| un operador logico |",
destino[i]);
}
}
//Operadores relacionales
for (int j = 0; j < tamOpeRe; j++)
{
if (destino[i] == OpeRe[j])
{
if (destino[i + 1] == '=' && destino[i + 2] != OpeRe[j])
{
Console.WriteLine("\n| {0}{1} | un operador relacional |",
destino[i], destino[i + 1]);
i = i + 1;
}
else
{
Console.WriteLine("\n| {0}
| un operador relacional |",
destino[i]);
}
}
}
}
Console.WriteLine("___________________________________");
break;
36
37
Console.WriteLine("\n| {0}{1}
| palabra reservada
| una letra
|",
destino[i]);
}
if (destino[i] == 'f')
{
if (destino[i] == 'f' && destino[i + 1] == 'o' && destino[i + 2]
== 'r')
{
Console.WriteLine("\n| {0}{1}{2}
|", destino[i], destino[i + 1], destino[i + 2]);
i = i + 2;
break;
}
else Console.WriteLine("\n| {0}
| palabra reservada
| una letra
|",
destino[i]);
}
if (destino[i] == 'd')
{
if (destino[i] == 'd' && destino[i + 1] == 'o')
{
Console.WriteLine("\n| {0}{1} | palabra reservada
|", destino[i], destino[i + 1]);
i = i + 1;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'w')
{
if (destino[i] == 'w' && destino[i + 1] == 'h' && destino[i +
2] == 'i' && destino[i + 3] == 'l' && destino[i + 4] == 'e')
{
39
reservada
4]);
| una letra
|",
destino[i]);
}
if (destino[i] == 'c')
{
if (destino[i] == 'c' && destino[i + 1] == 'a' && destino[i + 2]
== 's' && destino[i + 3] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3} | palabra reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3]);
i = i + 3;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 's')
{
if (destino[i] == 's' && destino[i + 1] == 'w' && destino[i +
2] == 'i' && destino[i + 3] == 't' && destino[i + 4] == 'c' && destino[i + 5] == 'h')
{
Console.WriteLine("\n| {0}{1}{2}{3}{4}{5} | palabra
reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3], destino[i + 4],
destino[i + 5]);
i = i + 5;
break;
}
else Console.WriteLine("\n| {0}
destino[i]);
}
if (destino[i] == 'e')
{
40
| una letra
|",
| una letra
|",
destino[i]);
}
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
}
//Nmeros
for (int j = 0; j < tamnum; j++)
{
if (destino[i] == numero[j])
{
Console.WriteLine("\n| {0}
| un numero
|",
destino[i]);
}
}
//Operadores aritmticos
for (int j = 0; j < tamOparit; j++)
{
if (destino[i] == Oparit[j])
{
Console.WriteLine("\n| {0}
destino[i]);
}
}
//Operadores lgicos
for (int j = 0; j < tamOpeLog; j++)
{
if (destino[i] == OpeLog[j])
{
Console.WriteLine("\n| {0}
| un operador logico |",
destino[i]);
}
41
}
//Operadores relacionales
for (int j = 0; j < tamOpeRe; j++)
{
if (destino[i] == OpeRe[j])
{
if (destino[i + 1] == '=' && destino[i + 2] != OpeRe[j])
{
Console.WriteLine("\n| {0}{1} | un operador relacional |",
destino[i], destino[i + 1]);
i = i + 1;
}
else
{
Console.WriteLine("\n| {0}
| un operador relacional |",
destino[i]);
}
}
}
}
Console.WriteLine("___________________________________");
break;
using System.Threading.Tasks;
namespace Analizador
{
class Program
{
static void Main(string[] args)
{
//a32e23
String cadena, Dato;
int tamcad, tamlet, tamnum, tamOparit, tamOpeRe, tamOpeLog, m = 1,
Opcion;
float a = 5, b = 10, c = 15;
float Resultado = 0;
char[] letra = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W','X','Y','Z'};
char[] numero = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
char[] Oparit = { '+', '-', '*', '/', '=' };
char[] OpeRe = { '<', '>', '!' };
char[] OpeLog = { '&', '|', '~' };
//Devuelve el tamao de la cadena
tamlet = letra.Length;
tamnum = numero.Length;
tamOparit = Oparit.Length;
tamOpeRe = OpeRe.Length;
tamOpeLog = OpeLog.Length;
Console.WriteLine("Que desea utilizar?");
Console.WriteLine("\n[1]Analizador Lexico");
Console.WriteLine("\n[2]Analizador Sintactico");
Console.Write("\nTu Opcion: ");
Dato = Console.ReadLine();
Opcion = Convert.ToInt32(Dato);
switch (Opcion)
{
case 1:
Console.WriteLine("\n\nAnalizador Lexico");
Console.Write("\nIngresa una expresion: ");
43
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino = new char[tamcad + 5];
cadena.CopyTo(0, destino, 0, tamcad);//Copia la cadena y la
almacena en un arreglo
Console.WriteLine("\n
Tabla de Simbolos");
Console.WriteLine("___________________________________");
//Palabras reservadas
for (int i = 0; i < tamcad; i++)
{
for (int j = 0; j < tamlet; j++)
{
if (destino[i] == letra[j])
{
if (destino[i] == 'i' || destino[i] == 'f' || destino[i] == 'd' || destino[i]
== 'w' || destino[i] == 'c' || destino[i] == 'e' || destino[i] == 's')
{
if (destino[i] == 'i')
{
if (destino[i] == 'i' && destino[i + 1] == 'f')
{
Console.WriteLine("\n| {0}{1} | palabra reservada
|", destino[i], destino[i + 1]);
i = i + 1;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'f')
{
if (destino[i] == 'f' && destino[i + 1] == 'o' && destino[i + 2]
== 'r')
{
Console.WriteLine("\n| {0}{1}{2}
|", destino[i], destino[i + 1], destino[i + 2]);
i = i + 2;
break;
}
else Console.WriteLine("\n| {0}
destino[i]);
}
44
| palabra reservada
| una letra
|",
if (destino[i] == 'd')
{
if (destino[i] == 'd' && destino[i + 1] == 'o')
{
Console.WriteLine("\n| {0}{1} | palabra reservada
|", destino[i], destino[i + 1]);
i = i + 1;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'w')
{
if (destino[i] == 'w' && destino[i + 1] == 'h' && destino[i +
2] == 'i' && destino[i + 3] == 'l' && destino[i + 4] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3}{4} | palabra
reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3], destino[i +
4]);
i = i + 4;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'c')
{
if (destino[i] == 'c' && destino[i + 1] == 'a' && destino[i + 2]
== 's' && destino[i + 3] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3} | palabra reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3]);
i = i + 3;
break;
}
else Console.WriteLine("\n| {0}
destino[i]);
45
| una letra
|",
}
if (destino[i] == 's')
{
if (destino[i] == 's' && destino[i + 1] == 'w' && destino[i +
2] == 'i' && destino[i + 3] == 't' && destino[i + 4] == 'c' && destino[i + 5] == 'h')
{
Console.WriteLine("\n| {0}{1}{2}{3}{4}{5} | palabra
reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3], destino[i + 4],
destino[i + 5]);
i = i + 5;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
if (destino[i] == 'e')
{
if (destino[i] == 'e' && destino[i + 1] == 'l' && destino[i + 2]
== 's' && destino[i + 3] == 'e')
{
Console.WriteLine("\n| {0}{1}{2}{3} | palabra reservada
|", destino[i], destino[i + 1], destino[i + 2], destino[i + 3]);
i = i + 4;
break;
}
else Console.WriteLine("\n| {0}
| una letra
|",
destino[i]);
}
}
else Console.WriteLine("\n| {0}
destino[i]);
}
}
//Nmeros
for (int j = 0; j < tamnum; j++)
{
if (destino[i] == numero[j])
{
46
| una letra
|",
Console.WriteLine("\n| {0}
| un numero
|",
destino[i]);
}
}
//Operadores aritmticos
for (int j = 0; j < tamOparit; j++)
{
if (destino[i] == Oparit[j])
{
Console.WriteLine("\n| {0}
destino[i]);
}
}
//Operadores lgicos
for (int j = 0; j < tamOpeLog; j++)
{
if (destino[i] == OpeLog[j])
{
Console.WriteLine("\n| {0}
| un operador logico |",
destino[i]);
}
}
//Operadores relacionales
for (int j = 0; j < tamOpeRe; j++)
{
if (destino[i] == OpeRe[j])
{
if (destino[i + 1] == '=' && destino[i + 2] != OpeRe[j])
{
Console.WriteLine("\n| {0}{1} | un operador relacional |",
destino[i], destino[i + 1]);
i = i + 1;
}
else
{
Console.WriteLine("\n| {0}
| un operador relacional |",
destino[i]);
}
}
}
}
Console.WriteLine("___________________________________");
47
break;
LENGUAJE INTERMEDIO
Un lenguaje intermedio se puede definir como una manera de representar procedimientos
y estructuras de datos que sirva como entrada para una MV en alguna parte de su
jerarqua, entre el lenguaje de entrada (el nivel ms alto) y el cdigo ejecutado en la
mquina (el nivel ms bajo) - tanto en el tiempo de compilacin como en el de ejecucin.
Para considerar el papel de los lenguajes intermedios y sus ventajas y desventajas,
conviene destacar la diferencia entre la traduccin de un lenguaje de alto nivel a cdigo
mquina anteriormente a su ejecucin (su compilacin) y su interpretacin, es decir, la
conversin decada instruccin del lenguaje a cdigo mquina y su ejecucin, una por una,
al ejecutar el programa. Este proceso se realiza a travs de una MV de interpretacin que
simula un ordenador cuyo cdigo mquina es el lenguaje de alto nivel que est siendo
interpretado. Y tpicamente, esta MV se construye a travs de un conjunto de programas
de cdigo mquina que representa los algoritmos y estructuras de datos necesarios para
la ejecucin de las instrucciones del lenguaje de alto nivel. Hay ventajas y desventajas en
cada manera de convertir los lenguajes de alto nivel a cdigo mquina, que se pueden
resumir as:
Compilacin
1. No hay que repetir la conversin de la misma instruccin a cdigo mquina cada vez
que aparece. Ventajas
2. Los programas corren muy rpido. Desventajas 1. Prdida de claridad e informacin
sobre el programa.
3. Dificultad en localizar la fuente exacta de error.
Ejemplos: Ada, C, C++, FORTRAN, Pascal Interpretacin
1. No hay prdida de claridad ni de informacin sobre un programa ni sobre donde estn
los errores.
2. No hay que decodificar cdigo que no se va a ejecutar.Ventajas3. El cdigo es
tpicamente ms compacto.
Desventajas
1. Los programas corren mucho ms lentamente se paga el coste de decodificar cada
instruccin. Ejemplos: HTML, Lisp, ML, Perl, Postscript, Prolog, Smalltalk
Estos dos casos representan los dos extremos porque, como ya se ha visto, existe
tambin lo que se llama la compilacin parcial, que es una mezcla de los dos enfoques,
donde se compila el lenguaje de alto nivel a un lenguaje intermedio (ms cerca de las
estructuras presentes en el cdigo mquina que las del cdigo fuente) y luego se
interpreta este lenguaje al ejecutar el programa. Como puede imaginarse, esta tcnica
49
combina las ventajas y desventajas de los dos enfoques anteriores. Un ejemplo de esta
combinacin existe en el lenguaje de programacin Java y su entorno. Entre otras cosas,
Java empez con la idea de liberar al programador de las dificultades deportar su
aplicacin a nuevas plataformas lo cual, si el programa est muy vinculado a algn
aspecto del sistema operativo donde fue escrito, podra ser muy difcil. Se compilar el
cdigo fuente de Java a un cdigo byte (bytecode) antes de ejecutarlo. Y a la hora de
correr el programa, este cdigo, como lenguaje intermedio, sera el lenguaje de entrada
para una MV, que con un conjunto de libreras (el entorno de ejecucin de Java, Java
Runtime o JRE), la interpretara para su ejecucin. Por lo tanto, este bytecode podra
correr en cualquier hardware donde haya una versin del JRE disponible. Como este
bytecode est ms cerca del nivel de mquina que de un lenguaje de alto nivel, los
programas corrern ms rpidamente
la naturaleza de C como una abstraccin del lenguaje ensamblador y su uso como
lenguaje de sistema en Unix-like y otros sistemas operativos lo han convertido en un
lenguaje intermedio popular: Eiffel, Sather, Esterel, algunos dialectos de Lisp (Lush,
Gambit, Haskell, Glasgow Haskell Compiler), Squeak, Cython, Seed7, Vala y otros usan C
como un lenguaje intermedio. Variantes de C han sido diseadas para proveer a C de
caractersticas como un lenguaje ensamblador portable, incluyendo C-- o el lenguaje
intermedio de C.
50
Estos lenguajes son los mas utilizado por los programadores. Estn diseados para que
las personas escriban y entiendan los programas de un modo mucho mas fcil que los
lenguajes mquina y ensamblador. Un programa escrito en lenguaje de alto nivel es
independiente de la mquina (las instrucciones no dependen del diseo del hardware o de
una computadora en particular), por lo que estos programas son portables o
transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados
con poca o ninguna modificacin en diferentes tipos de computadoras. Son lenguajes de
programacin en los que las instrucciones enviadas para que el ordenador ejecute ciertas
rdenes son similares al lenguaje humano. Dado que el ordenador no es capaz de
reconocer estas ordenes, es necesario el uso de un intrprete que traduzca el lenguaje de
alto nivel a un lenguaje de bajo nivel que el sistema pueda entender.
Por lo general se piensa que los ordenadores son mquinas que realizan tareas de
clculos o procesamiento de texto. La descripcin anterior es slo una forma muy
esquemtica de ver una computadora. Hay un alto nivel de abstraccin entre lo que se
pide a la computadora y lo que realmente comprende. Existe tambin una relacin
compleja entre los lenguajes de alto nivel y el cdigo mquina.
Los lenguajes de alto nivel son normalmente fciles de aprender porque estn formados
por elementos de lenguajes naturales, como el ingls. En BASIC, el lenguaje de alto nivel
ms conocido, los comandos como IF CONTADOR=10 THEN STOP pueden utilizarse
para pedir a la computadora que pare si CONTADOR es igual a diez. Por desgracia para
muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que
las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una
forma rgida y sistemtica.
Los lenguajes de alto nivel, tambin denominados lenguajes evolucionados, surgen con
posterioridad a los anteriores (lenguaje mquina, lenguajes de bajo nivel o ensamblador)
con los siguientes objetivos, entre otros:
Lograr independencia de la maquina, pudiendo utilizar un mismo programa en diferentes
equipos con la nica condicin de disponer de un programa traductor o compilador, que
es suministrado por el fabricante, para obtener el programa ejecutable en lenguaje binario
de la maquina que se trate. Adems, no se necesita conocer el hardware especifico de
dicha maquina. Aproximarse al lenguaje natural, para que el programa se pueda escribir y
leer de una forma ms sencilla, eliminando muchas de las posibilidades de cometer
errores que se daban en el lenguaje maquina, ya que se utilizan palabras (en ingles) en
lugar de cadenas de smbolos sin ningn significado aparente.
Incluir rutinas de uso frecuente, como las de entrada / salida, funciones matemticas,
manejo de tablas, etc., que figuran en una especie de librera del lenguaje, de manera que
se puedan utilizar siempre que se quiera sin necesidad de programarlas cada vez.
Ventajas de los lenguajes de alto nivel: el tiempo de formacin de los programadores es
relativamente corto comparado con otros lenguajes. La escritura de programas se basa en
reglas sintcticas similares a los lenguajes humanos, nombres de las instrucciones tales
51
como READ, WRITE, PRINT, OPEN, etc. Las modificaciones y puestas a punto de los
programas son ms fciles. Reduccin del costo de los programas. Transportabilidad.
Permiten tener una mejor documentacin. Son ms fciles de mantener.
Por lo general se piensa que los ordenadores son mquinas que realizan tareas de
clculos o procesamiento de textos. La descripcin anterior es slo una forma muy
esquemtica de ver una computadora. Hay un alto nivel de abstraccin entre lo que se
pide a la computadora y lo que realmente comprende. Existe tambin una relacin
compleja entre los lenguajes de alto nivel y el cdigo mquina.
Los lenguajes de alto nivel son normalmente fciles de aprender porque estn formados
por elementos de lenguajes naturales, como el ingls. En BASIC, el lenguaje de alto nivel
ms conocido, los comandos como
"IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que
pare si CONTADOR es igual a 10. Por desgracia para muchas personas esta forma de
trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen
comprender un lenguaje natural, lo hacen en realidad de una forma rgida y sistemtica.
Desventajas de los lenguajes de alto nivel: incremento del tiempo de puesta a punto al
necesitarse diferentes traducciones del programa fuente para conseguir el programa
definitivo. No se aprovechan los recursos internos de la maquina que se explotan mucho
mejor en lenguajes mquina y ensambladores. Aumento de la ocupacin de memoria. El
tiempo de ejecucin de los programas es mucho mayor.
Se puede decir que el principal problema que presentan los lenguajes de alto nivel es la
gran cantidad de ellos que existen actualmente en uso, adems de las diferentes
versiones o dialectos que se han desarrollado de algunos de ellos. Es difcil establecer
una clasificacin general de los mismos, ya que en cualquiera que se realice habr
lenguajes que pertenezcan a mas de uno de los grupos establecidos. Una clasificacin
muy extendida, atendiendo a la forma de trabajar de los programas y a la filosofa con que
fueron concebidos.
Un ejemplo de cdigo seria programacin hibrida metiendo en un lenguaje de C++ este
cdigo ejecuta este fragmento de cdigo
#include "stdafx.h"
#include <conio.h>
#include<iostream>
#include<stdlib.h>
52
53
do
{
cout << "MENU" << endl << endl;
cout << "1)Convertidor de bases" << endl << endl;
cout << "2)Suma" << endl << endl;
cout << "3)Resta" << endl << endl;
cout << "4)Division" << endl << endl;
cout << "5)Factorial de un numero" << endl << endl;
cout << "6)Tabla ASCII" << endl << endl;
cout << "7)Salir" << endl << endl;
cout << "Selecione una opcion: "; cin >> op;
switch (op)
{case 1:
{
system("cls");
_cputs(bufer);
a = _getche();
while (a >= '0'&&a <= '9')
{
_asm sub a, 30h;
b = b * 10 + a;
a = _getche();
}
_putch(10);
_putch(13);
for (i = 2; i < 17; i++)
{
54
_cputs(bufer1);
muestra(10, i);
_cputs(": ");
muestra(i, b);
_putch(10);
_putch(13);
}
_getch();
break;
}
case 2:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
suma(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
55
case 3:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
resta(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
case 4:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
division(a, c);
_putch(10);
_putch(13);
56
_getch();
break;
}
case 5:
{system("cls");
cout << "Meta un numero: ";
cin >> a;
fac(a);
_getch();
break;
}
case 6:
{
system("cls");
for (i = 0; i < 256; i++)
{
cout << i << ".- ";
ascii(i);
_putch(10);
}
_getch();
break;
}
}
} while (op != 7);
57
return 0;
}
Lo que mostrar a este programa ser la opcin numero 5 a la cual llamaremos numero
factorial que quedera de esta manera.
void ascii(int n)
{
int r;
_asm
{
mov eax, n
mov r, eax
}
_putch(r);
}
int _tmain(int argc, _TCHAR* argv[])
{
int i, op;
do
{
cout << "MENU" << endl << endl;
cout << "1)Convertidor de bases" << endl << endl;
cout << "2)Suma" << endl << endl;
cout << "3)Resta" << endl << endl;
cout << "4)Division" << endl << endl;
cout << "5)Factorial de un numero" << endl << endl;
cout << "6)Tabla ASCII" << endl << endl;
cout << "7)Salir" << endl << endl;
cout << "Selecione una opcion: "; cin >> op;
59
switch (op)
{case 1:
{
system("cls");
_cputs(bufer);
a = _getche();
while (a >= '0'&&a <= '9')
{
_asm sub a, 30h;
b = b * 10 + a;
a = _getche();
}
_putch(10);
_putch(13);
for (i = 2; i < 17; i++)
{
_cputs(bufer1);
muestra(10, i);
_cputs(": ");
muestra(i, b);
_putch(10);
_putch(13);
}
_getch();
break;
}
60
case 2:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
suma(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
case 3:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
resta(a, c);
_putch(10);
61
_putch(13);
_getch();
break;
}
case 4:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
division(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
case 5:
{system("cls");
cout << "Meta un numero: ";
cin >> a;
fac(a);
_getch();
break;
62
}
case 6:
{
system("cls");
for (i = 0; i < 256; i++)
{
cout << i << ".- ";
ascii(i);
_putch(10);
}
_getch();
break;
}
}
} while (op != 7);
return 0;
}
63
El ultimo cdigo muestra como podemos sumar 2 numero con ambos lenguajes unidos el
cdigo quedara de esta forma
#include "stdafx.h"
#include <conio.h>
#include<iostream>
#include<stdlib.h>
_asm
{
mov eax, num
add eax, num2
mov r1, eax
}
_cputs("Suma: ");
cout << r1;
_putch(10);
}
int _tmain(int argc, _TCHAR* argv[])
{
int i, op;
do
{
cout << "MENU" << endl << endl;
cout << "1)Convertidor de bases" << endl << endl;
cout << "2)Suma" << endl << endl;
cout << "3)Resta" << endl << endl;
cout << "4)Division" << endl << endl;
cout << "5)Factorial de un numero" << endl << endl;
cout << "6)Tabla ASCII" << endl << endl;
cout << "7)Salir" << endl << endl;
cout << "Selecione una opcion: "; cin >> op;
65
switch (op)
{case 1:
{
system("cls");
_cputs(bufer);
a = _getche();
while (a >= '0'&&a <= '9')
{
_asm sub a, 30h;
b = b * 10 + a;
a = _getche();
}
_putch(10);
_putch(13);
for (i = 2; i < 17; i++)
{
_cputs(bufer1);
muestra(10, i);
_cputs(": ");
muestra(i, b);
_putch(10);
_putch(13);
}
_getch();
break;
}
66
case 2:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
suma(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
case 3:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
resta(a, c);
_putch(10);
_putch(13);
67
_getch();
break;
}
case 4:
{
system("cls");
_cputs("Meta el primer valor: ");
cin >> a;
_putch(10);
_cputs("meta el seundo valor: ");
cin >> c;
_putch(10);
division(a, c);
_putch(10);
_putch(13);
_getch();
break;
}
case 5:
{system("cls");
cout << "Meta un numero: ";
cin >> a;
fac(a);
_getch();
break;
}
68
case 6:
{
system("cls");
for (i = 0; i < 256; i++)
{
cout << i << ".- ";
ascii(i);
_putch(10);
}
_getch();
break;
}
}
} while (op != 7);
return 0;
}
Y mostrare la operacin de esta forma
69
Esto es la manera de acciones que podemos utilizar un lenguaje de alto nivel en uno
intermedio pudiendo utilizar lenguaje ensamblador
}
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')
74
{
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();
}
}
}
}
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')
78
{
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();
}
}
}
}
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')
82
{
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();
}
}
}
83
namespace MTOperaciones
{
class Program
{
static void Main(string[] args)
{
String cadena;
int tamcad, tamlet, tamOparit;
int a = 5, b = 10, c = 15, m = 1;
double Resultado = 0;
84
//Console.WriteLine("Analizador Sintactico\n");
//Console.WriteLine("a = 5, b = 10, c= 15\n");
AS[0] = destino[0];
m = 0;
for (int n = 0; n < tamOparit; n++)
{
for (int o = 0; o < destino.Length; o++)
{
if (Oparit[n] == destino[o])
{
OM[m] = destino[o];
}
}
}
if(OM[0] == '+')
{
if (AS[0] == 'a' && AS[1] == 'b')
{
86
Resultado = a + b;
}
87
Resultado = b + c;
}
88
89
90
{
Resultado = a * a;
}
91
{
Resultado = b * a;
}
92
93
94
Segundo programa:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MTOperaciones
{
class Program
{
static void Main(string[] args)
{
String cadena;
int tamcad, tamlet, tamOparit;
int a = 5, b = 10, c = 15, m = 1;
double Resultado = 0;
//Console.WriteLine("Analizador Sintactico\n");
//Console.WriteLine("a = 5, b = 10, c= 15\n");
AS[0] = destino[0];
96
m = 0;
for (int n = 0; n < tamOparit; n++)
{
for (int o = 0; o < destino.Length; o++)
{
if (Oparit[n] == destino[o])
{
OM[m] = destino[o];
}
}
}
if(OM[0] == '+')
{
if (AS[0] == 'a' && AS[1] == 'b')
{
Resultado = a + b;
}
97
98
99
Resultado = a - c;
}
100
Resultado = c - a;
}
101
102
103
{
Resultado = b / b;
}
104
{
Resultado = c / b;
}
}
Ejemplo 2:
Tercer programa:
using System;
using System.Collections.Generic;
105
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MTOperaciones
{
class Program
{
static void Main(string[] args)
{
String cadena;
int tamcad, tamlet, tamOparit;
int a = 5, b = 10, c = 15, m = 1;
double Resultado = 0;
//Console.WriteLine("Analizador Sintactico\n");
//Console.WriteLine("a = 5, b = 10, c= 15\n");
AS[0] = destino[0];
m = 0;
for (int n = 0; n < tamOparit; n++)
107
{
for (int o = 0; o < destino.Length; o++)
{
if (Oparit[n] == destino[o])
{
OM[m] = destino[o];
}
}
}
if(OM[0] == '+')
{
if (AS[0] == 'a' && AS[1] == 'b')
{
Resultado = a + b;
}
108
109
110
111
112
Resultado = b * b;
}
113
Resultado = c * b;
}
}
114
115
cadena = Console.ReadLine();
tamcad = cadena.Length;//Devuelve el tamao de la cadena
char[] destino2 = new char[tamcad];
cadena.CopyTo(0, destino2, 0, tamcad);//Copia la cadena y la
almacena en un arreglo
AS[0] = destino2[0];
m = 0;
for (int n = 0; n < tamOparit; n++)
{
for (int o = 0; o < destino2.Length; o++)
117
{
if (Oparit[n] == destino2[o])
{
OM[m] = destino2[o];
}
}
}
if (OM[0] == '+')
{
if (AS[0] == 'a' && AS[1] == 'b')
{
Resultado = a + b;
}
118
119
120
Resultado = b - b;
}
121
Resultado = c - b;
}
}
122
123
124
{
Resultado = c / c;
}
125
Ejemplo 1:
126
Ejemplo 2:
127
Conclusin
En las actividades anteriores se ha demostrado que es posible establecer un
camino evolutivo continuo en el que se sitan los algoritmos de anlisis sintctico
que incorporan las estrategias de anlisis ms importantes, tanto para el caso de
las gramticas de adjuncin de rboles como para el caso de las gramticas
lineales de ndices. Los lenguajes evolucionan con el tiempo, adquiriendo nuevas
construcciones y realizando tareas adicionales. Estas nuevas construcciones se
pueden aadir con ms facilidad a un lenguaje cuando existe una aplicacin
basada en una descripcin gramatical del lenguaje. Finalmente hemos analizado
que dentro de los analizadores sintcticos que vimos, pudimos notar la diferencia
entre los que son descendentes y los ascendentes, y sus principales
caractersticas, viendo tambin la forma normal de Chomsky que es de gran
importancia en el anlisis sintctico. Por otro lado, llevamos los conocimientos
tericos a la prctica mediante las actividades y programas relacionados con las
mismas.
128
Bibliografa
129
130