You are on page 1of 20

7-12-2014

COMPILADORES Y TEORA
DEL LENGUAJE
ANALIZADOR LEXICO Y
SEMANTICO DE EXPRESIONES

YULY SANDRA CHOQUE RAMOS


2012-36143

COMPILADORES Y TEORA DEL LENGUAJE

CONTENIDO
ANALIZADOR LEXICO Y SEMANTICO .................................................................... 2
I.

INTRODUCCIN ................................................................................................. 2

II.

CAPTULO I: COMPILADORES .................................................................... 4


1.

QU ES UN COMPILADOR? ........................................................................ 4

2.

CLASIFICACIN DE COMPILADORES ....................................................... 5

3.

FUNCIONES DE UN COMPILADOR ............................................................ 6

4.

PARTES DE UN COMPILADOR .................................................................... 8

III.

CAPTULO 2: APLICACIN ANALISIS LEXICO Y SINTACTICO DE UNA

EXPRESION. ............................................................................................................. 11
CDIGO ................................................................................................................. 11
DEMOSTRACIN ................................................................................................. 16
CONCLUSIONES ...................................................................................................... 18
RECOMENDACIONES ............................................................................................. 18
BIBLIOGRAFA ........................................................................................................ 19

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE

ANALIZADOR LEXICO Y SEMANTICO


I.

INTRODUCCIN

En 1946 se desarroll el primer ordenador digital. En un principio, estas mquinas


ejecutaban instrucciones consistentes en cdigos numricos que sealan a los circuitos de
la mquina los estados correspondientes a cada operacin. Esta expresin mediante
cdigos numricos se llam Lenguaje Mquina, interpretado por un secuenciador
cableado o por un microprograma. Pero los cdigos numricos de las mquinas son
engorrosos. Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de
escribir sus programas mediante claves ms fciles de recordar que esos cdigos
numricos; al final, todas esas claves juntas se traducan manualmente a Lenguaje
Mquina. Estas claves constituyen los llamados lenguajes ensambladores, que se
generalizaron en cuanto se dio el paso decisivo de hacer que las propias mquinas
realizaran el proceso mecnico de la traduccin. A este trabajo se le llama ensamblar el
programa.
Dada su correspondencia estrecha con las operaciones elementales de las mquinas, las
instrucciones de los lenguajes ensambladores obligan a programar cualquier funcin de
una manera minuciosa e iterativa. De hecho, normalmente, cuanto menor es el nivel de
expresin de un lenguaje de programacin, mayor rendimiento se obtiene en el uso de los
recursos fsicos (hardware). A pesar de todo, el lenguaje ensamblador segua siendo el de
una mquina, pero ms fcil de manejar. Los trabajos de investigacin se orientaron
entonces hacia la creacin de un lenguaje que expresara las distintas acciones a realizar
de una manera lo ms sencilla posible para el hombre. As, en 1950, John Backus dirigi
una investigacin en I.B.M. en un lenguaje algebraico. En 1954 se empez a desarrollar
un lenguaje que permita escribir frmulas matemticas de manera traducible por un
ordenador. Le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje
considerado de alto nivel. Se introdujo en 1957 para el uso de la computadora IBM
modelo 704. Permita una programacin ms cmoda y breve que lo existente hasta ese
momento, lo que supona un considerable ahorro de trabajo. Surgi as por primera vez
el concepto de un traductor, como un programa que traduca un lenguaje a otro lenguaje.

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje
traducido de bajo nivel, se emplea el trmino compilador.
La tarea de realizar un compilador no fue fcil. El primer compilador de FORTRAN tard
18 aos-persona en realizarse y era muy sencillo. Este desarrollo del FORTRAN estaba
muy influenciado por la mquina objeto en la que iba a ser implementado. Como un
ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido
a que el perifrico que se utilizaba como entrada de programas (una lectora de tarjetas
perforadas) no contaba correctamente los espacios en blanco. Paralelamente al desarrollo
de FORTRAN en Amrica, en Europa surgi una corriente ms universitaria, que
pretenda que la definicin de un lenguaje fuese independiente de la mquina y en
De todas formas, y en contra de lo que quiz pueda pensarse, todava se estn llevando a
cabo varias vas de investigacin en este fascinante campo de la compilacin. Por una
parte, se estn mejorando las diversas herramientas disponibles (por ejemplo, el
generador de analizadores lxicos Aardvark para el lenguaje PASCAL). Tambin la
aparicin de nuevas generaciones de lenguajes -ya se habla de la quinta generacin, como
de un lenguaje cercano al de los humanos-ha provocado la revisin y optimizacin de
cada una de las fases del compilador. El ltimo lenguaje de programacin de amplia
aceptacin que se ha diseado, el lenguaje Java, establece que el compilador no genera
cdigo para una mquina determinada sino para una virtual, la Java Virtual Machine
(JVM), que posteriormente ser ejecutado por un intrprete, normalmente incluido en un
navegador de Internet. El gran objetivo de esta exigencia es conseguir la mxima
portabilidad de los programas escritos y compilados en Java, pues es nicamente la
segunda fase del proceso la que depende de la mquina concreta en la que se ejecuta el
intrprete.

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


II.

CAPTULO I: COMPILADORES
1. Qu es un compilador?

Un traductor es cualquier programa que toma como entrada un texto escrito en un


lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto.

Ilustracin 1: funcin de un compilador

En el caso de que el lenguaje fuente sea un lenguaje de programacin de alto nivel y el


objeto sea un lenguaje de bajo nivel (ensamblador o cdigo de mquina), a dicho traductor
se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el
lenguaje ensamblador. Un intrprete no genera un programa equivalente, sino que toma
una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo
equivalente y al mismo tiempo lo ejecuta. Histricamente, con la escasez de memoria de
los primeros ordenadores, se puso de moda el uso de intrpretes frente a los compiladores,
pues el programa fuente sin traducir y el intrprete juntos daban una ocupacin de
memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores
personales iban siempre acompaados de un intrprete de BASIC (Spectrum,
Commodore VIC-20, PC XT de IBM, etc.). La mejor informacin sobre los errores por
parte del compilador as como una mayor velocidad de ejecucin del cdigo resultante
hizo que poco a poco se impusieran los compiladores. Hoy en da, y con el problema de
la memoria prcticamente resuelto, se puede hablar de un gran predominio de los
compiladores frente a los intrpretes, aunque intrpretes como los incluidos en los
navegadores de Internet para interpretar el cdigo JVM de Java son la gran excepcin.
Ventajas de compilar frente a interpretar:
Se compila una vez, se ejecuta n veces.
En bucles, la compilacin genera cdigo equivalente al bucle, pero interpretndolo se
traduce tantas veces una lnea como veces se repite el bucle.
El compilador tiene una visin global del programa, por lo que la informacin de
mensajes de error es mas detallada.
Ventajas del intrprete frente al compilador:
YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


Un intrprete necesita menos memoria que un compilador. En principio eran ms
abundantes dado que los ordenadores tenan poca memoria.
Permiten una mayor interactividad con el cdigo en tiempo de desarrollo.
Un compilador no es un programa que funciona de manera aislada, sino que necesita de
otros programas para conseguir su objetivo: obtener un programa ejecutable a partir de
un programa fuente en un lenguaje de alto nivel. Algunos de esos programas son el
preprocesador, el linker, el depurador y el ensamblador. El preprocesador se ocupa
(dependiendo del lenguaje) de incluir ficheros, expandir macros, eliminar comentarios, y
otras tareas similares. El linker se encarga de construir el fichero ejecutable aadiendo al
fichero objeto generado por el compilador las cabeceras necesarias y las funciones de
librera utilizadas por el programa fuente. El depurador permite, si el compilador ha
generado adecuadamente el programa objeto, seguir paso a paso la ejecucin de un
programa. Finalmente, muchos compiladores, en vez de generar cdigo objeto, generan
un programa en lenguaje ensamblador que debe despus convertirse en un ejecutable
mediante un programa ensamblador.
2. Clasificacin de compiladores
El programa compilador traduce las instrucciones en un lenguaje de alto nivel a
instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de
programacin se requiere un compilador separado. El compilador traduce todo el
programa antes de ejecutarlo. Los compiladores son, pues, programas de traduccin
insertados en la memoria por el sistema operativo para convertir programas de cmputo
en pulsaciones electrnicas ejecutables (lenguaje de mquina). Los compiladores pueden
ser de:
Una sola pasada: examina el cdigo fuente una vez, generando el cdigo o programa
objeto.
Pasadas mltiples: requieren pasos intermedios para producir un cdigo en otro lenguaje,
y una pasada final para producir y optimizar el cdigo producido durante los pasos
anteriores.
Optimacin: lee un cdigo fuente, lo analiza y descubre errores potenciales sin ejecutar
el programa.

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


Compiladores incrementales: generan un cdigo objeto instruccin por instruccin (en
vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. El
otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen
conjuntamente.
Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.
Compilador cruzado: se genera cdigo en lenguaje objeto para una mquina diferente de
la que se est utilizando para compilar. Es perfectamente normal construir un compilador
de Pascal que genere cdigo para MS-DOS y que el compilador funcione en Linux y se
haya escrito en C++.
Compilador con montador: compilador que compila distintos mdulos de forma
independiente y despus es capaz de enlazarlos.
Autocompilador: compilador que est escrito en el mismo lenguaje que va a compilar.
Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al
lenguaje, mejorar el cdigo generado, etc.
Metacompilador: es sinnimo de compilador de compiladores y se refiere a un programa
que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un
compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los
metacompiladores se encuentra con la dificultad de unir la generacin de cdigo con la
parte de anlisis. Lo que s se han desarrollado son generadores de analizadores lxicos y
sintcticos. Por ejemplo, los conocidos:

LEX: generador de analizadores lxicos

YACC: generador de analizadores sintcticos

desarrollados para UNIX. Los inconvenientes que tienen son que los analizadores
que generan no son muy eficientes.

Descompilador: es un programa que acepta como entrada cdigo mquina y lo


traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilacin.

3. Funciones de un compilador
A grandes rasgos un compilador es un programa que lee un programa escrito es un
lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


lenguaje objeto. Como parte importante de este proceso de traduccin, el compilador
informa a su usuario de la presencia de errores en el programa fuente.
A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de
lenguajes fuente, desde los lenguajes de programacin tradicionales, como FORTRAN o
Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las reas
de aplicacin de la informtica. Los lenguajes objeto son igualmente variados; un
lenguaje objeto puede ser otro lenguaje de programacin o el lenguaje de mquina de
cualquier computador entre un microprocesador y un supercomputador. A pesar de existir
una aparente complejidad por la clasificacin de los compiladores, como se vio en el tema
anterior, las tareas bsicas que debe realizar cualquier compilador son esencialmente las
mismas. Al comprender tales tareas, se pueden construir compiladores para una gran
diversidad de lenguajes fuente y mquinas objeto utilizando las mismas tcnicas bsicas.
Nuestro conocimiento sobre cmo organizar y escribir compiladores ha aumentado
mucho desde que comenzaron a aparecer
los primeros compiladores a principios de los aos cincuenta. Es difcil dar una fecha
exacta de la aparicin del primer compilador, porque en un principio gran parte del trabajo
de experimentacin y aplicacin se realiz de manera independiente por varios grupos.
Gran parte de los primeros trabajos de compilacin estaba relacionada con la traduccin
de frmulas aritmticas a cdigo de mquina.
En la dcada de 1950, se consider a los compiladores como programas notablemente
difciles de escribir. EL primer compilador de FORTRAN, por ejemplo, necesit para su
implantacin de 18 aos de trabajo en grupo (Backus y otros [1975]). Desde entonces, se
han descubierto tcnicas sistemticas para manejar muchas de las importantes tareas que
surgen en la compilacin. Tambin se han desarrollado buenos lenguajes de implantacin,
entornos de programacin y herramientas de software. Con estos avances, puede hacerse
un compilador real incluso como proyecto de estudio en un curso de un semestre sobre
diseo sobre de compiladores.

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


4. Partes de un compilador
Conceptualmente un compilador opera en fases. Cada una de las cuales transforma el
programa fuente de una representacin en otra. En la figura 3 se muestra una
descomposicin tpica de un compilador. En la prctica se pueden agripar fases y las
representaciones intermedias entres las fases agrupadas no necesitan ser construidas
explcitamente.

Ilustracin 2: Partes de un compilador

Programa objeto

Las tres primeras fases, que forman la mayor parte de la porcin de anlisis de un
compilador se analizan en la seccin IX. Otras dos actividades, la administracin de la
tabla se smbolos y el manejo de errores, se muestran en interaccin con las seis fases de
anlisis lxico, anlisis sintctico, anlisis semntico, generacin de cdigo intermedio,

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE


optimacin de cdigo y generacin de cdigo. De modo informal, tambin se llamarn
"fases" al administrador de la tabla de smbolos y al manejador de errores.

Administrador de la tabla de smbolos

Una funcin esencial de un compilador es registrar los identificadores utilizados en el


programa fuente y reunir informacin sobre los distintos atributos de cada identificador.
Estos atributos pueden proporcionar informacin sobre la memoria asignada a un
identificador, su tipo, su mbito (la parte del programa donde tiene validez) y, en el caso
de nombres de procedimientos, cosas como el nmero y tipos de sus argumentos, el
mtodo de pasar cada argumento (por ejemplo, por referencia) y el tipo que devuelve, si
los hay.
Una tabla de smbolos es una estructura de datos que contiene un registro por cada
identificador, con los campos para los atributos del identificador. La estructura de datos
permite encontrar rpidamente el registro de cada identificador y almacenar o consultar
rpidamente datos en un registro
Cuando el analizador lxico detecta un indentificador en el programa fuente, el
identificador se introduce en la tabla de smbolos. Sin embargo, normalmente los atributos
de un identificador no se pueden determinar durante el anlisis lxico. Por ejemplo, en
una declaracin en Pascal como var posicin, inicial, velocidad : real;
El tipo real no se conoce cuando el analizador lxico encuentra posicin, inicial y
velocidad.
Las fases restantes introducen informacin sobre los identificadores en la tabla de
smbolos y despus la utilizan de varias formas. Por ejemplo, cuando se est haciendo el
anlisis semntico y la generacin de cdigo intermedio, se necesita saber cules son los
tipos de los identificadores, para poder comprobar si el programa fuente los usa de una
forma vlida y as poder generar las operaciones apropiadas con ellos. El generador de
cdigo, por lo general, introduce y utiliza informacin detallada sobre la memoria
asignada a los identificadores.

YULY SANDRA CHOQUE RAMOS

COMPILADORES Y TEORA DEL LENGUAJE

Deteccin e informacin de errores

Cada frase puede encontrar errores. Sin embargo, despus de detectar un error. Cada
fase debe tratar de alguna forma ese error, para poder continuar la compilacin,
permitiendo la deteccin de ms errores en el programa fuente. Un compilador que se
detiene cuando encuentra el primer error, no resulta tan til como debiera.
Las fases de anlisis sintctico y semntico por lo general manejan una gran proporcin
de los errores detectables por el compilador. La fase lxica puede detectar errores donde
los caracteres restantes de la entrada no forman ningn componente lxico del lenguaje.
Los errores donde la cadena de componentes lxicos violan las reglas de estructura
(sintaxis) del lenguaje son determinados por la fase del anlisis sintctico.
Durante el anlisis semntico el compilador intenta detectar construcciones que tengan
la estructura sintctica correcta, pero que no tengan significado para la operacin
implicada, por ejemplo, si se intenta sumar dos identificadores. Uno de los cuales es el
nombre de una matriz, y el otro, el nombre de un procedimiento.

YULY SANDRA CHOQUE RAMOS

10

COMPILADORES Y TEORA DEL LENGUAJE

III.

CAPTULO

2:

APLICACIN

ANALISIS

LEXICO

SINTACTICO DE UNA EXPRESION.


Cdigo
Cdigo de un analizador lxico y sintctico de una expresin, realizado en Visual
Studio 2013: VISUAL BASIC CONSOLA
La explicacin de este cdigo la pueden encontrar el video de youtube llamado:
ANALIZADOR LEXICO Y SINTACTICO DE UNA EXPRESION
Con el enlace:
https://www.youtube.com/watch?v=XwbzHhHTbH4&list=UUAq9NFNWLnKXwHZz
U0FdGhg
Module Module1
Sub Main()
Console.WriteLine(" ")
Console.WriteLine("CURSO: COMPILADORES Y TEORIA DEL LENGUAJE")
Console.WriteLine("TRABAJO: ANALIZADOR LEXICO Y SEMANTICO DE UNA
EXPRESION")
Console.WriteLine(" ")
Console.WriteLine("INTEGRANTE:")
Console.WriteLine("YULY SANDRA CHOQUE RAMOS")
Console.WriteLine(" ")
Console.WriteLine("INGRESE UNA EXPRESION ...")
Console.WriteLine(" ")
Dim myString As String = Console.ReadLine
Console.WriteLine(" ")
Dim myChar As String
Dim TestLen As Integer = Len(myString)
Dim exp(TestLen) As String
Dim i As Integer
Dim J As Integer
Console.WriteLine("ANALIZADOR LEXICO: ")
Console.WriteLine("
TOKENS RECONOCIDOS: ")
Console.Write("
")
For i = 0 To (TestLen - 1)
myChar = myString.Chars(i)
If myChar = "+" Or myChar = "-" Or myChar = "/" Or myChar = "*" Or
myChar = "=" Or myChar = "^" Then
exp(i) = "op"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "a" Or myChar = "b" Or myChar = "c" Or myChar = "d"
Or myChar = "e" Or myChar = "f" Or myChar = "g" Or myChar = "h" Or myChar = "i"
Or myChar = "j" Or myChar = "k" Or myChar = "l" Then
exp(i) = "exp"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "1" Or myChar = "2" Or myChar = "3" Or myChar = "4"
Or myChar = "5" Or myChar = "6" Or myChar = "7" Or myChar = "8" Or myChar = "9"
Then

YULY SANDRA CHOQUE RAMOS

11

COMPILADORES Y TEORA DEL LENGUAJE


exp(i) = "num"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = "(" Then
exp(i) = "par_d"
Console.Write("<" & exp(i) & "," & myChar & ">")
ElseIf myChar = ")" Then
exp(i) = "par_iz"
Console.Write("<" & exp(i) & "," & myChar & ">")
Else
Console.WriteLine(myChar & "
End If
Next
Console.WriteLine(" ")
Dim z As Integer
J = 0
z = 1
Console.WriteLine("
Console.WriteLine("

TOKEN NO RECONOCIDO ")

")
TABLA DE SIMBOLOS :")

For J = 0 To (TestLen - 1)
myChar = myString.Chars(J)
If myChar = "+" Or myChar = "-" Or myChar = "/" Or myChar = "*" Or
myChar = "=" Or myChar = "^" Then
' Console.Write("<" & myChar & ">")
ElseIf myChar = "a" Or myChar = "b"
Or myChar = "e" Or myChar = "f" Or myChar = "g"
Or myChar = "j" Or myChar = "k" Or myChar = "l"
Console.WriteLine("
<id," &
z = z + 1

Or myChar = "c" Or myChar = "d"


Or myChar = "h" Or myChar = "i"
Then
z & "> = " & myChar)

ElseIf myChar = "1" Or myChar = "2" Or myChar = "3" Or myChar =


"4" Or myChar = "5" Or myChar = "6" Or myChar = "7" Or myChar = "8" Or myChar =
"9" Then
'Console.Write("<" & myChar & ">")
ElseIf myChar = "(" Then
' Console.Write(myChar)
ElseIf myChar = ")" Then
'Console.Write(myChar)
Else
Console.WriteLine(myChar & "
Console.WriteLine(myChar & "
End If
Next
J = 0
z = 1
Console.WriteLine("
Console.WriteLine("
Console.Write("
")

")
TOKEN NO RECONOCIDO")

")
EXPRESION ANALIZADA LEXCAMENTE :")

For J = 0 To (TestLen - 1)
myChar = myString.Chars(J)

YULY SANDRA CHOQUE RAMOS

12

COMPILADORES Y TEORA DEL LENGUAJE


If myChar = "+" Or myChar = "-" Or myChar = "/" Or myChar = "*" Or
myChar = "=" Or myChar = "^" Then
Console.Write("<" & myChar & ">")
ElseIf myChar = "a" Or myChar = "b" Or myChar
Or myChar = "e" Or myChar = "f" Or myChar = "g" Or myChar
Or myChar = "j" Or myChar = "k" Or myChar = "l" Then
Console.Write("<id," & z & ">")
z = z + 1
ElseIf myChar = "1" Or myChar = "2" Or myChar
Or myChar = "5" Or myChar = "6" Or myChar = "7" Or myChar
Then
Console.Write("<" & myChar & ">")

= "c" Or myChar = "d"


= "h" Or myChar = "i"

= "3" Or myChar = "4"


= "8" Or myChar = "9"

ElseIf myChar = "(" Then


Console.Write(myChar)
ElseIf myChar = ")" Then
Console.Write(myChar)
Else
Console.WriteLine(myChar & "
End If

TOKEN NO RECONOCIDO")

Next
Console.WriteLine(" ")
Dim g As Integer
Dim h As Integer
Dim e As Integer
i = 0
h = 1
e = 0
g = 0
Console.WriteLine(" ")
Console.WriteLine("ANALIZADOR SINTACTICO: ")
'Console.WriteLine(":::::TOKENS:::::")
For i = 0 To TestLen - 1
If i = 0 Then
If myString.Chars(i) = "(" Then
g = g + 1
Else
If exp(i) = "exp" Or exp(i) = "num" Then
Else
If myString.Chars(i) = "-" Then
Else
If myString.Chars(i) = "+" Or myString.Chars(i) = "*"
Or myString.Chars(i) = "/" Or myString.Chars(i) = "^" Or myString.Chars(i) = "="
Then
Console.WriteLine("
ERROR EN EL CARACTER " &
i & " :")
Console.WriteLine("
no se puede escribir un
operador " & myString.Chars(i) & " al comienzo de una expresion")
h = 0
End If

YULY SANDRA CHOQUE RAMOS

13

COMPILADORES Y TEORA DEL LENGUAJE


End If
End If
End If
Else
Select Case exp(i)
Case "exp"
If myString.Chars(i - 1) = "(" Then
Else
If exp(i - 1) = "op" Then
Else
Console.WriteLine("

ERROR EN EL CARACTER " &

i & " :")


Console.WriteLine("
expresion despues de una expresion")
h = 0
End If
End If

no se puede poner una

Case "num"
If myString.Chars(i - 1) = "(" Then
Else
If exp(i - 1) = "op" Then
Else
Console.WriteLine("

ERROR EN EL CARACTER " &

i & " :")


Console.WriteLine("
expresion despues de una expresion")
h = 0
End If
End If

no se puede poner una

Case "op"
If exp(i - 1) = "par_d" Or myString.Chars(i - 1) = "="
Then
If myString.Chars(i) = "-" Then
Else
Console.WriteLine("

ERROR EN EL CARACTER " &

i & " :")


Console.WriteLine("
no se puede escribir el
operador " & myString.Chars(i) & " despues de un " & myString.Chars(i - 1))
h = 0
End If
Else
If exp(i - 1) = "exp" Or exp(i - 1) = "num" Then
Else
If myString.Chars(i - 1) = ")" Then
Else
Console.WriteLine("

ERROR EN EL CARACTER

" & i & " :")

YULY SANDRA CHOQUE RAMOS

14

COMPILADORES Y TEORA DEL LENGUAJE


Console.WriteLine("

no se puede poner un

operador depues de un operador")


h = 0
End If
End If
End If
Case "par_d"
g = g + 1

If myString.Chars(i - 1) = "(" Then


Else
If exp(i - 1) = "op" Then
Else
Console.WriteLine("

ERROR EN EL CARACTER " &

i & " :")


Console.WriteLine("
parentesis cerrado despues de una parentesis abierto")
h = 0

no se puede poner una

End If
End If
Case "par_iz"
e = e + 1
If exp(i - 1) = "exp" Or exp(i - 1) = "num" Then
Else
If exp(i - 1) = "par_iz" Then
Else
If exp(i - 1) = "op" Then
Console.WriteLine("

ERROR EN EL CARACTER

" & i & " :")


Console.WriteLine("
parentesis abierto luego de un operador")
Else
Console.WriteLine("
" & i & " :")
Console.WriteLine("
parentesis juntos sin ninguna expresion")
End If
h = 0

no se puede poner un

ERROR EN EL CARACTER
no se puede poner dos

End If
End If
End Select

End If
Next
If h = 1 Then
Console.WriteLine("
End If
Console.WriteLine(" ")

NO MUESTRA ERRORES")

YULY SANDRA CHOQUE RAMOS

15

COMPILADORES Y TEORA DEL LENGUAJE


Console.WriteLine("
RESULTADO DEL ANALIZADOR SINTACTICO:")
If h = 1 Then
If e = g Then
Console.WriteLine("
::LA EXPRESION ESTA BIEN ESCRITA")
Else
Console.WriteLine("
::LE FALTA UNA PARENTESIS")
End If
Else
Console.WriteLine("
::ERROR EN LA EXPRESION")
End If
Dim expresion As String = Console.ReadLine
End Sub
End Module

DEMOSTRACIN
EJEMPLO 1: a=b+c
Este ejemplo demuestra cmo se analiza una expresin bien escrita la cual muestra que
no tiene errores. Y el analizador sintctico nos dice que : LA EXPRESION ESTA BIEN
ESCRITA

Ilustracin 3: ejemplo 1: a=b+c

YULY SANDRA CHOQUE RAMOS

16

COMPILADORES Y TEORA DEL LENGUAJE

EJEMPLO 2: *(a+b)=c
En este ejemplo se puede observar como el analizador lxico analiza los tokens y como
el analizador sintctico nos muestra que la expresin tiene un error uno de sus
caracteres, y te dice que el resultado en el analizador sintctico presenta un error.

Ilustracin 4: ejemplo 2 *(a+b)=c

YULY SANDRA CHOQUE RAMOS

17

COMPILADORES Y TEORA DEL LENGUAJE

CONCLUSIONES

El analizador lxico nos sirve para declarar los tokens que puede recibir nuestra
expresin, y nos muestra cada uno de los tokens de la expresin

El analizador sintctico nos muestra los errores que puede tener la expresin , nos
da las reglas a la cual la expresin se debe de acogerse para que esta sea correcta.

RECOMENDACIONES

Al momento de hacer un cdigo para un analizador lxico y sintctico se


deben de tener en cuenta todos los posibles casos que la expresin pueda
aceptar , as como saber que variables, expresiones y operadores aceptara
nuestro analizador.

YULY SANDRA CHOQUE RAMOS

18

COMPILADORES Y TEORA DEL LENGUAJE

BIBLIOGRAFA

Compiladores, Principios, tcnicas y herramientas, Alfred V. Aho, Ravi Sethi,


Jeffrey D. Ullman. Addison Wesley iberoamericana.

http://www.dlsi.ua.es/docencia/asignaturas/comp1/comp1.html

http://www.cps.unizar.es/~ezpeleta/COMPI

http://www.ii.uam.es/~alfonsec

Compiladores: Conceptos Fundamentales. B. Teufel, S. Schmidt, T. Teufel.


Addison Wesley Iberoamericana.

YULY SANDRA CHOQUE RAMOS

19

You might also like