Escolar Documentos
Profissional Documentos
Cultura Documentos
10320978
11320155
10320918
Contenido
Introduccin......................................................................................................... 3
Actividad 1: Reporte de la aplicacin de los tipos de notacin para la conversin de
expresiones: Infija, prefija y posfija, como resultado de su ejecucin en un programa
diseado en C#.................................................................................................... 6
Actividad 2: Reporte de la aplicacin del manejo de tipos en las expresiones y el uso de
operadores........................................................................................................ 13
Actividad 3: Cdigo intermedio de la estructura de un lenguaje de programacin de alto
nivel.................................................................................................................. 14
Actividad 4: Lenguaje prototipo aplicando las acciones construidas a la gramtica.......27
Actividad 5: Tres programas tipo, usando la gramtica definida de su lenguaje de
programacin..................................................................................................... 37
Actividad 6: Reporte del avance por equipo del proyecto final consistente en desarrollar
software de base: traductor, intrprete o compilador................................................46
Conclusin........................................................................................................ 63
Bibliografas....................................................................................................... 64
Introduccin
Generacin de cdigo intermedio
Caractersticas destacadas:
Tipo 1
Ventajas:
Tipo 2
rbol sintctico.
rbol sintctico abstracto (todos los nodos del rbol representan smbolos
terminales, los nodos hijos son operandos y los nodos internos son operadores).
Notacin posfija.
Tipo 3
Tripelatas
Ejemplo:
d = a + b * c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) <operador>,<operando_1>,
<operando_2>
Cuartetos
Ejemplo:
d = a + b * c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, , d)
PreFija:
InFija:
PosFija:
=+2*34x =*+234x
Notacin infija
2+3*4 = x
Notacin posfija
234*+x= 23+4*x=
(2+3)*4 = x
Desarrollo
Cdigo
Conversin de expresiones infija a posfija
#include <stdio.h>
bool isOperator(char c)
{
if (c=='+' || c=='-' || c=='*' || c=='/' || c=='^' || c=='(' || c==')')
return true;
return false;
}
int precedencia (char x, char y)
{
int prec1, prec2;
switch(x)
{
case '+':
prec1=1;
break;
case '-':
prec1=2;
7
break;
case '*':
prec1=3;
break;
case '/':
prec1=4;
break;
case '^':
prec1=5;
}
switch(y)
{
case '+':
prec2=1;
break;
case '-':
prec2=2;
break;
case '*':
prec2=3;
break;
case '/':
prec2=4;
break;
case '^':
prec2=5;
}
return prec1-prec2;
}
int main()
{
char *inf = new char[401];
char *post = new char[401];
char *pila = new char[200];
int ptr=0;
int n, j=0;
scanf("%d", &n);
while(n>0)
{
scanf("%s", inf);
for(int i=0; inf[i]!='\0'; i++)
{
if (!isOperator(inf[i]))
{
post[j]=inf[i];
j++;
}
else if (inf[i]=='(')
{
pila[++ptr]='(';
}
else if (inf[i]==')')
{
while(pila[ptr]!='(' && ptr>0)
{
post[j]=pila[ptr--];
j++;
}
if (pila[ptr]=='(')
ptr--;
}
else
{
while(precedencia(inf[i], pila[ptr]) < 0 && pila[ptr]!='(' && ptr>0)
{
post[j]=pila[ptr--];
j++;
}
pila[++ptr]=inf[i];
}
}
while(ptr>0)
{
post[j]=pila[ptr--];
j++;
}
post[j]='\0';
9
printf("%s\n", post);
j=0;ptr=0;
n--;
}
return 0;
}
}
Pantallazos
10
Conclusiones
Para concluir tenemos que las pilas las listas enlazadas, todos sus mtodos y las
diferentes expresiones son una de las herramientas utilizadas para programar y
procesar de una manera automatizada todos los sistemas que usamos da tras da
en relacin a tcnicas o mtodos para agilizar operaciones. Estas herramientas
son uno de los instrumentos ms usados en la programacin para estructurar y
organizar informacin.
Bibliografa
http://www.monografias.com/trabajos44/pilas-listas-expresiones/pilas-listasexpresiones2.shtml#ixzz3nXiPGmfk
http://www.lawebdelprogramador.com/foros/Dev-C/724318-Transformar-notacion-i
11
Desarrollo
12
Operador de asignacin
El operador de asignacin se representa por la secuencia de caracteres:=. Permite
asignar a una variable el valor de una expresin. Por ejemplo:
var x,y,z: real;
Begin
x:=12.5;
y:=-5.7;
z:=2*x+3*y;
Operadores aritmticos
Los operadores aritmticos operan sobre valores de tipo entero o real. Los
operadores aritmticos se resumen en la Tabla 12. En el caso del operador
unitario de cambio de signo, el resultado es del mismo tipo que el del operando; en
el caso de los tres primeros operadores binarios (suma, resta y producto) si ambos
operandos son enteros el resultado es entero, si alguno es real el resultado es
real. Con el fin de mantener la coherencia durante la operacin, para un operador
binario, operandos con distinto tipo se convierten a un mismo tipo comn antes de
la operacin. El tipo comn es el tipo de dato predefinido de TurboPascal con el
menor intervalo de representacin que incluye los valores de ambos operandos.
Un concepto equivalente sera el de mnimo comn mltiplo.
Por ejemplo, el tipo comn de dos tipos byte e integer es el tipo integer. El tipo
comn de dos tipos integer y word es un longint. El tipo comn de dos tipos integer
y real es un real. La operacin se lleva a cabo dentro del intervalo de
representacin y con la precisin de este tipo comn y el resultado es tambin de
este tipo comn.
Operadores de relacin
Los operadores de relacin son operadores binarios en los que los operandos son
ordinales, reales o de cadena. Los dos primeros operadores sirven tambin para
13
operandos de tipo record y punteros. Todos ellos dan lugar a resultados de tipo
booleano. Losoperadores de relacin se resumen en la Tabla 13.
14
15
Conclusin
En este tema se presentan los siguientes elementos de la programacin: las
expresiones y los operadores. Se define el concepto de expresin y se contina
con el estudio de los distintos tipos de operadores: aritmtico, de relacin,
bolanos y de bit. En el apartado final se analizan las reglas de prioridad de los
operadores que se siguen en la evaluacin de expresiones de todo tipo. Una
expresin es una combinacin de operadores y operandos. Los datos u operandos
pueden ser constantes, variables y llamadas a funciones. Adems, dentro de una
expresin pueden encontrarse subexpresiones encerradas entre parntesis.
Bibliografas
Garca-Beltrn, A., Martnez, R. y Jan, J.A. Mtodos Informticos en TurboPascal,
Ed.Bellisco, 2 edicin, Madrid, 2002
Joyanes, L. Fundamentos de programacin, Algoritmos y Estructuras de Datos,
McGrawHill, Segunda edicin, 1996
Duntemann, J. La Biblia de TurboPascal, Anaya Multimedia, Madrid, 1991
16
* op es un operador.
*dst es el registro destino de la operacin.
*op1 y op2 son los operandos. Si op termina en i, el segundo operando es un valor
inmediato
(Entero o real).
17
Por ejemplo, la sentencia a:= b*(-c), donde a es una variable local en la direccin 1
respecto al registro $fp y b y c son variables globales en las direcciones 1000 y
1001, se puede traducir como:
Lw $r1, 1000($zero)
lw $r2, 1001($zero)
multi $r3, $r2, -1
mult $r4, $r1, $r3
sw $r4, 1($fp)
lw $r1, 1000($zero)
lw $r2, 1001($zero)
multi $r2, $r2, -1
mult $r1, $r1, $r2
sw $r1, 1($fp)
Si las variables estuvieran en los registros $r1, $r2 y $r3, podramos incluso no
utilizar ningn registro auxiliar:
18
Expresiones aritmticas
Comenzamos el estudio por las expresiones aritmticas. Lo que tendremos que
hacer es crear por cada tipo de nodo un mtodo, genera Cdigo, que genere el
cdigo para calcular la expresin y lo emita. Ese cdigo dejar a el resultado en un
registro, cuyo nombre devolver a genera Cdigo como resultado.
19
Mtodo generaCdigo ()
izda:= i.generaCdigo ();
dcha:= d.generaCdigo ();
r =reserva Registro ();
emite (add r, izda, dcha);
devuelve r;
fin genera Cdigo
...
fin Nodo Suma
20
fin generaCdigo
...
fin Nodo Constante
Para las variables, tendremos que distinguir segn si son locales o globales y
acceder a la direccin correspondiente. Las variables globales tendrn una
direccin absoluta a la que accederemos utilizando el registro $zero como base y
las variables locales y parmetros de las funciones tendrn una direccin relativa
al registro $fp (frame pointer):
Objeto NodoAccesoVariable:
...
Mtodo generaCdigo()
r :=reserva Registro();
if eslocal entonces
emite(lw r, dir($fp) );
si no
emite(lw r, dir($zero) );
fin si
devuelve r;
fin generaCdigo
...
fin NodoVariableGlobal
21
lw $r1, 1000($zero)
addi $r2, $zero, 2
add $r3, $r1, $r2
lw $r4, 1001($zero)
lw $r5, 1002($zero)
add $r6, $r4, $r5
mult $r7, $r3, $r6
22
Objeto NodoSuma:
...
Mtodo generaCdigo()
izda:= i.generaCdigo();
dcha:= d.generaCdigo();
emite(add r, izda, dcha);
liberaRegistro(dcha);
devuelve izda;
fin generaCdigo
...
fin NodoSuma
lw $r1, 1000($zero)
addi $r2, $zero, 2
add $r1, $r1, $r2
lw $r2, 1001($zero)
lw $r3, 1002($zero)
add $r2, $r2, $r3
mult $r1, $r1, $r2
Ejemplo:
24
<dgito>::= 0|1|2|3|4|5|6|7|8|9
<letra>::= a|b|c|x|y|z
<identificador>::=<letra>|<identificador><dgito>|<identificador><letra>
<dgito>
<identificador>
|
<identificador> <dgito>
|
|
25
<identificador><letra>
|
|
<letra>
b
|a
Un lenguaje de programacin completo se define comenzando con un smbolo noterminal tal como <programa>, conocido como start symbol (smbolo inicial) y
desde el cual todos los posibles programas pueden ser derivados. En la prctica,
los rboles de derivacin se crean de dos formas posibles. En un esquema topdown, la sentencia requerida se deriva del smbolo inicial tal cual como hicimos en
el ejemplo (ab1). En un esquema bottom-up, el punto de partida es la sentencia
requerida, la cual es reducida al smbolo inicial reemplazando las partes derechas
por sus correspondientes partes izquierdas de las reglas de produccin. Ambos
esquemas se utilizan en la fase de anlisis sintctico de muchos compiladores.
Una gramtica que define un lenguaje de programacin tiene un nmero finito de
reglas de produccin, pero como las reglas de produccin contienen recursin, es
posible generar infinitos programas posibles.
Ejemplo:
<ident>::=<ident><dgito>
Cuando se incluye recursin en las reglas de produccin hay que tener cuidado.
Hay que asegurarse que la recursin termine. Una regla de produccin tal como la
anterior se dice que es recursiva a izquierda. Existen definiciones similares pero
recursivas a derecha.
Ejemplo: Gramtica para una sentencia de asignacin
<asig>::= <id>:=<exp>
<id>::= A| B| C |D (tambin podra ser la definicin de identificador anterior)
<exp>::= <exp> + <exp>
| <exp> * <exp>
| <id>
26
A:= B + C * D
rbol 1
<asig>
|
<id>
|
A
|
<id>
|
B
|
C
:= <exp>
|
<exp>
+
<exp>
|
<exp> * <exp>
|
|
<id> <id>
|
D
rbol 2
<asig>
|
<id> :=
<exp>
|
|
A
<exp> * <exp>
|
|
<exp> + <exp>
<id>
|
|
|
<id> <id> D
|
|
B
C
En general la ambigedad sintctica de las estructuras de un lenguaje es un
problema, debido a que los compiladores basan la semntica de esas estructuras
en su estructura sintctica. Si una estructura del lenguaje tiene ms de un rbol de
27
Dnde:
G={ N, T, P, S}
28
T = {var, , , ; , : , etc}
}
S = {<declaracin>}
Prototipo de gramatica
return v.visitaSkip(this);
}
}
class BinOp extends Expr { public Operator op; public Expr e1,e2;
}
}
Se define una clase abstracta Visitor cuyas subclases representarn posibles
recorridos. La clase incluye mtodos del tipo Object visitaX(X n) para cada tipo de
nodo X del rbol sintctico.
abstract class Visitor { Object visitaWhile(While w); Object visitaIf(If i); Object
visitaSeq(Seq s);
Object visitaAssign(Assign a); Object visitaSkip(Skip s); Object visitaBinOp(BinOp
b); Object visitaVar(Var v); Object visitaConst(Const c);
}
A continuacin se define como un posible recorrido del rbol sintctico y por tanto,
una subclase de Visitor.
32
Object visitaSkip(Skip s) {
}
Object visitaBinOp(BinOp b) {
Value v1 = (Value) b.e1.visita(this); Value v2 = (Value) b.e2.visita(this); return
(b.op.apply(v1,v2));
}
Object visitaVar(Var v){ return lookup(v.name);
}
33
Object exec(Comm c) {
representa en BNF comoS ::= aS a. Tenemos tambin la notacin BNFextendida que incluye adems los smbolos [] y {} para indicar elementos
opcionales y repeticiones, respectivamente.
Tenemos un lenguaje de programacin cuyas dos primeras reglas de produccin
para denir su sintaxis son:
37
char entrada[50];
char *ca=entrada; /*caracter actual*/
//declaracion de funcionees
void E();
void Eprima();
void T();
void Tprima();
void R();
void Rprima();
void W();
void Wprima();
void F();
void Aceptado();
int main(){
cout<<"ingrese la expresion: ";
gets(entrada);
E();
cout<<"\nLa expresion si es valida\n"<<endl;
system("pause");
}
void E()// *E > TE
{
T();
38
Eprima();
}
ca++;
R();
Tprima();
}
//vaco
}
void R() // R > WR
{
W();
Rprima();
}
void Rprima() // R > -WR|vaco
{
if(*ca=='-')
{
Aceptado();
ca++;
W();
Rprima();
}
//vaco
}
void W() // W > FW
40
{
F();
Wprima();
}
Aceptado();
ca++;
E();
if (*ca==')')
{
Aceptado();
ca++;
}
else
{
cout<<"se espera parentesis derecho u operador :"<<endl;
system("pause");
exit(0);
}
}
else
{
cout<<"se espera digito o parntesis izquierdo:"<<endl;
system("pause");
exit(0);
}
}
void Aceptado() //esta funcin avisa que el caracter actual es aceptado
{
cout<<" caracter ' "<<*ca<<" ' aceptado"<<endl;
42
Programa 2:
#include<iostream>
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string>
#define TAM_BUFFER 100
using namespace std;
classLexico
{
char *nombreFichero;
FILE* entrada;
43
int n1;
int traza;
char buffer[TAM_BUFFER];
int pBuffer;
public:
Lexico(char *unNombreFichero, int una_traza=0);
~Lexico(void);
char siguienteToken(void);
void devuelveToken(char toke);
int lineaActual(void){return n1;};
int existeTraza(void){if(traza)return 1; else return 0;}
};
Lexico::~Lexico()
{
fclose(entrada);
}
char Lexico::siguienteToken(void)
{
char car;
while((car=((pBuffer>0) ? buffer[-pBuffer]:getc(entrada)))!=EOF)
{
if(car==' ') continue;
if(car=='\n'){++n1; continue;}
break;
}
case'{':
case'.':
case'+':
case'*':
case'-':
case'/':
case'%':
return(car);
}
if(islower(car))return(car);
else if(isdigit(car)) return(car);
else
{
cout<<"Error Lexico: Token Desconocido"<<endl; system("pause");
exit(-4);
}
return(car);
}
46
exit(-5);
}
else { buffer[pBuffer++]=token;
if(existeTraza())
cout<<"ANALIZADOR LEXICO: Recibe en buffer el token"<<token<<endl;
system("pause");
}
}
int main()
{
int traza;
char token;
Lexicoobj("ejemplo_minidev.txt",1);
if(obj.existeTraza()) cout<<"INICIO DE ANALISIS"<<endl;
while((token=obj.siguienteToken() )!='}') cout<<token<<endl;
system("pause");
return 0;
}
47
Programa 3:
void inapre(){
system("cls");
int cy=0,rt=0,p=0,uui=0;
for(int g=0;g<=n;g++){
if(Frase[g] == ')' || Frase[g] == '+' || Frase[g] == '-' ||Frase[g] == '/' ||
Frase[g] == '*'||Frase[g] == '('||Frase[g] == '^'){{
//cout<<endl<<prioridad(Frase[g])<<" "<<prioridad(pi[cy1])<<endl<<endl;
//cout<<Frase[g]<<" "<<pi[cy-1]<<endl;
if( (Frase[g] != pi[cy-1]) && ( prioridad(Frase[g]) == prioridad(pi[cy-1]) )
&& cy != 0 && Frase[g] != '(' && Frase[g] != ')'&& pi[cy-1] != '(' && pi[cy-1] !=
')'){
pref[rt] = pi[cy-1];
cout<<pref[rt]<<" prio"<<endl;
cout<<pi<<" SP "<<endl;
rt++;
pi[cy-1] = Frase[g];
cy--;
}
if(Frase[g] == ')' ){
for(int jj=p+1;jj<cy;jj++){
pref[rt] = pi[jj];
cout<<pref[rt]<<" SS "<<endl;
rt++;
}
for(int hrh = p;hrh<=cy;hrh++){
pi[hrh] = ' ';
}
cy = p;
}
if(Frase[g] == '('){
p = cy;
}
if(Frase[g] != ')'){
pi[cy] = Frase[g];
cout<<pi<<" S "<<endl;
cy++;
}
}
48
49
Introduccin de sentencia.
Infijo a postfijo:
50
Infijo a prefijo:
Actividad 6: Reporte del avance por equipo del proyecto final consistente en
desarrollar software de base: traductor, intrprete o compilador.
51
}
system("pause");
} //Fin codigo intermedio
void CodInterFor(){//Codigo intermedio For
system("cls");
int cyf=0;
int pc=0;
int qw2=0,qw1=0;
char pcl[10];
char ins1[10];
for(int jn=0;jn<=n;jn++){
if(Frase[jn] == '(' && Frase[jn+1] == ')'){
cout<<"Debe ingresar una condicion"<<endl;
}else{//FIN IF 1
if(Frase[jn] == 'F' && Frase[jn+1] == 'o' && Frase[jn+2] == 'r'
&& Frase[jn+3] == '('){//IF 2
cyf++;
}
} //FIN IF 2
if(Frase[jn] == ';'){
pc++;
}
if(pc == 1 && Frase[jn] == ';'){
for(int qw = jn+1; Frase[qw] != ';' ;qw++,qw2++){
pcl[qw2] = Frase[qw];
}
}
if(Frase[jn] == ')' ){//FIN IF3
for(int qw = (jn+2) ; Frase[qw] != '}' ;qw++,qw1++){//FOR
ins1[qw1] = Frase[qw];
}//FIN FOR
}//FIN IF 3
}//FIN FOR
cout<<Frase<<endl;
if(cyf > 0 && pc == 2){
cout<<"Etiqueta1:"<<endl;
53
for(int mm=0;mm<qw2;mm++){
cout<<pcl[mm];
}
cout<<endl;
cout<<"Salta Si falso Etiqueta2"<<endl;
for(int mm=0;mm<qw1;mm++){
cout<<ins1[mm];
}
cout<<endl;
cout<<"Salta Etiqueta1"<<endl;
cout<<"Etiqueta2:"<<endl;
cout<<"END"<<endl;
}
system("pause");
}//Fin codigo intermedio for
55
56
Como se observa en la siguiente imagen adems de generar una operacin y mostrarnos los tokens de dicha operacin
este nos genera el cdigo intermedio y a su vez nos muestra el ejemplo de nuestra operacin en lo que seria el lenguaje
ensamblador, para ello necesitamos lo que es la generacin de cdigo intermedio y anlisis lxico y sintctico, para poder
llevar a cabo la Graficacin de nuestro rbol sintctico.
57
Anexo
Para llevar a cabo la funcin del analizador tomamos en cuenta los que son los
caracteres del cdigo asccii esto ms que nada es para tener un control de los
tokens y as mismo poder identificarlos ms fcilmente cuando se realice su
compilacin o ejecucin. El siguiente cdigo realiza el trabajo de la imagen
anterior, identifica cada token y este los va almacenando de manera que los
compare con nuestro alfabeto.
Public Sub analizar()
token = ""
Dim estadios As Integer = 0
Dim numtoken As Integer
Dim arr() As String = RichTextBox1.Text.Split(ChrW(10))
Dim nn, mm As Integer
For nn = 0 To arr.Length - 1
For mm = 0 To Len(arr(nn)) - 1
Dim c, d As String
c = Asc(arr(nn).Chars(mm))
If (estadios = 0) Then
estadios = estado(c)
End If
Try
d = Asc(arr(nn).Chars(mm + 1))
Catch
d = -4
End Try
sig = d
estadios = 0
numtoken = 1
End If
Case 2
token = token + arr(nn).Chars(mm)
If (sig < 58 And sig > 47) Then
estadios = 2
ElseIf (sig = 46) Then
estadios = 3
Else
estadios = 0
numtoken = 2
End If
Case 3
token = token + arr(nn).Chars(mm)
If (sig < 58 And sig > 47) Then
estadios = 4
Else
estadios = -1
End If
Case 4
token = token + arr(nn).Chars(mm)
If (sig < 58 And sig > 47) Then
estadios = 4
Else
estadios = 0
numtoken = 3
End If
Case 100
estadios = -2
Case -1
token = token + arr(nn).Chars(mm)
numtoken = 10
estadios = 0
Case 300
token = token + arr(nn).Chars(mm)
numtoken = 20
estadios = 0
Case 400
token = token + arr(nn).Chars(mm)
numtoken = 40
estadios = 0
Case 500
59
token = token +
numtoken = 50
estadios = 0
Case 501
token = token +
numtoken = 60
estadios = 0
Case 502
token = token +
numtoken = 70
estadios = 0
Case 503
token = token +
numtoken = 80
estadios = 0
Case 504
token = token +
numtoken = 90
estadios = 0
arr(nn).Chars(mm)
arr(nn).Chars(mm)
arr(nn).Chars(mm)
arr(nn).Chars(mm)
arr(nn).Chars(mm)
End Select
If estadios = 0 Then
numerotoken.Add(numtoken)
lexema.Add(token)
token = ""
Next
Next
For ii = 0 To numerotoken.Count - 1
If (numerotoken(ii) = 1) Then
If lexema(ii) = palabras_reservadas(1) Or lexema(ii) =
palabras_reservadas(2) Or lexema(ii) = palabras_reservadas(3) _
Or lexema(ii) = palabras_reservadas(4) Or lexema(ii) =
palabras_reservadas(5) Or lexema(ii) = palabras_reservadas(6) _
Or lexema(ii) = palabras_reservadas(7) Or lexema(ii) =
palabras_reservadas(8) Or lexema(ii) = palabras_reservadas(9) _
Or lexema(ii) = palabras_reservadas(10) Or lexema(ii) =
palabras_reservadas(11) Or lexema(ii) = palabras_reservadas(12) _
Or lexema(ii) = palabras_reservadas(13) Or lexema(ii) =
palabras_reservadas(14) Or lexema(ii) = palabras_reservadas(15) _
Or lexema(ii) = palabras_reservadas(16) Or lexema(ii) =
palabras_reservadas(17) Or lexema(ii) = palabras_reservadas(18) _
Or lexema(ii) = palabras_reservadas(19) Or lexema(ii) =
palabras_reservadas(20) Or lexema(ii) = palabras_reservadas(21) _
Or lexema(ii) = palabras_reservadas(22) Or lexema(ii) =
palabras_reservadas(23) Or lexema(ii) = palabras_reservadas(24) _
Or lexema(ii) = palabras_reservadas(25) Or lexema(ii) =
palabras_reservadas(26) Or lexema(ii) = palabras_reservadas(27) _
Or lexema(ii) = palabras_reservadas(28) Or lexema(ii) =
palabras_reservadas(29) Or lexema(ii) = palabras_reservadas(30) Then
reserva(cont1) = lexema(ii)
cont1 = cont1 + 1
ListBox2.Items.Add("Palabra Reservada:" & " " &
lexema(ii))
Else
reserva(cont1) = lexema(ii)
cont1 = cont1 + 1
ListBox2.Items.Add("identificador" & " " & lexema(ii))
End If
ElseIf (numerotoken(ii) = 10) And (lexema(ii) <> ChrW(10)) And
(lexema(ii) <> ChrW(13)) Then
ListBox2.Items.Add("Operador Matematico" & " " &
lexema(ii))
ElseIf (numerotoken(ii) = 40) And (lexema(ii) <> ChrW(10)) And
(lexema(ii) <> ChrW(13)) Then
ListBox2.Items.Add("Operador Comparativo" & " " & lexema(ii))
61
End If
Next
'For i = 0 To cont1
'If reserva(i) = palabras_reservadas(2) Or reserva(i) =
palabras_reservadas(3) Or reserva(i) = palabras_reservadas(4) _
' Or reserva(i) = palabras_reservadas(5) Or reserva(i) =
palabras_reservadas(6) Or reserva(i) = palabras_reservadas(11) _
' And parenta(i) = caracteres(1) And parentc(i) = caracteres(2) Then
'ListBox2.Items.Add("Funcion" & " " & reserva(i) & parenta(i) &
num(i) & parentc(i))
'Else
'ListBox1.Items.Add("Error" & " " & reserva(i) & parenta(i) & num(i)
& parentc(i))
'End If
'Next
End Sub
Conclusion
Esta fase del compilador no es en realidad una parte separada del compilador, la
mayora de los compiladores generan cdigo como parte del proceso de anlisis
63
Sin embargo si se construye un lenguaje intermedio, tan slo son necesarios 2*n
traductores.
As por ejemplo un fabricante de compiladores puede construir un compilador
para diferentes mquinas objeto con tan slo cambiar las dos ltimas fases de la
tarea de sntesis.
Referencias
Garca-Beltrn, A. M. (s.f.). Mtodos Informticos . Mc Graw Hill.
64
65