Академический Документы
Профессиональный Документы
Культура Документы
SUPERIOR DE ALVARADO
Materia:
AUTOMATA 2
Semestre-Grupo:
7 GRUPO UNICO
Producto Acadmico:
REPORTE DE PRACTICA
Temas:
ANALIZADOR LEXICO Y SINTANCTICO
Presenta:
MANUEL DE JESUS CRUZ PORTELA
Docente:
ISC. MARIA GUADALUPE GARCIA
INDICE
ANALIZADOR LEXICO Y SEMANTICO .........................................................................2
I. INTRODUCCIN ..................................................................................................2
CONCLUSIONES ...........................................................................................................18
RECOMENDACIONES ..................................................................................................18
BIBLIOGRAFA .............................................................................................................19
I. INTRODUCCIN
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.
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.
El compilador tiene una visin global del programa, por lo que la informacin de
mensajes de error es ms detallada.
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.
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++.
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
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.
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.
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,
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
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.
Sub Main()
Console.WriteLine(" ")
Console.WriteLine("MATERIA: AUTOMATA 2
Console.WriteLine("TRABAJO: ANALIZADOR LEXICO Y SEMANTICO DE UNA
EXPRESION")
Console.WriteLine(" ")
Console.WriteLine("INTEGRANTE:")
Console.WriteLine("MANUEL DE JESUS CRUZ PORTELA")
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: ")
myString.Chars(i)
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
exp(i) = "num"
Console.Write("<" & exp(i) & "," & myChar & ">")
Else
Console.WriteLine(myChar & " TOKEN NO RECONOCIDO ")
End If
Next
Console.WriteLine(" ") Dim
z As Integer
J = 0
z = 1
Console.WriteLine(" ") Console.WriteLine("
TABLA DE SIMBOLOS :")
myString.Chars(J)
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
Console.WriteLine(" <id," & z & "> = " & myChar) z
= z + 1
Else
Console.WriteLine(myChar & " ")
Console.WriteLine(myChar & " TOKEN NO RECONOCIDO")
End If
Next
J = 0
z = 1
Console.WriteLine(" ")
Console.WriteLine(" EXPRESION ANALIZADA LEXCAMENTE :")
Console.Write(" ")
myString.Chars(J)
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
Console.Write("<id," & z & ">") z = z
+ 1
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 & ">")
Else
Console.WriteLine(myChar & " TOKEN NO RECONOCIDO")
End If
Next
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
End If
End If
End If
Else
Select Case exp(i)
Case "exp"
Else
If exp(i - 1) = "op" Then
Else
i & " :") Console.WriteLine(" ERROR EN EL CARACTER " &
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(" no se puede poner una
expresion despues de una expresion")
h = 0
End If
End If
Case "op"
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 & " :")
End If
End If
End If
Case "par_d"
g = g + 1
Else
Console.WriteLine(" ERROR EN EL CARACTER " &
i & " :")
Console.WriteLine(" no se puede poner una
parentesis cerrado despues de una parentesis abierto")
h = 0
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
" & i & " :") Console.WriteLine(" ERROR EN EL CARACTER
End If
End If
End Select
End If
Next
If h = 1 Then
Console.WriteLine(" NO MUESTRA ERRORES")
End If
Console.WriteLine(" ")
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
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.
CONCLUSIONES
El analizador lxico nos sirve para declarar los tokens que puede recibir nuestra
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
BIBLIOGRAFA