TRABAJO A ENTREGAR:
ANALIZADOR SINTACTICO DE ALGORITMOS
ASIGNATURA:
Lenguajes y Autómatas
CARRERA:
Ingeniería en Sistemas Computacionales
Elaboró:
Gómez Martínez Guillermo
Grupo: 6S2
Profesor: Roberto Ramírez
Introducción
El analizador sintáctico tiene como objetivo encontrar las estructuras presentes en su entrada. Estas estructuras se pueden representar mediante el árbol de análisis sintáctico, que explica cómo se puede derivar la cadena de entrada en la gramática que especifica el lenguaje. Aunque en la práctica es habitual que el árbol de análisis no llegue a construirse, se trata de una abstracción que nos permite entender mejor todo el proceso. Para construir la especificación sintáctica de los lenguajes de programación, se suelen emplear gramáticas incontextuales, generalmente restringidas para que el análisis se pueda realizar de manera eficiente. Para que sea posible construir el árbol de análisis, es necesario que la entrada no presente errores sintácticos. En caso de que los haya, el analizador debe informar de su presencia adecuadamente y, si es posible, intentar continuar el análisis.
Objetivo
EL objetivo de esta investigación es conocer acerca sobre un analizador sintáctico así como su definición, su estructura y denotaciones que lo componen.
Otro importante objetivo es saber la aplicación de un analizador sintáctico y su semántica del autómata.
Escritura de una Gramática
Una Gramática es la definición de un lenguaje. Lenguaje es la colección (finita o no) de palabras de un alfabeto (representado por å ), por ejemplo, cualquier subconjunto de å * (conjunto de todas las posibles palabras definidas sobre un alfabeto). El alfabeto del lenguaje L de la lógica proposicional contiene dos tipos de signos: los conectores y las letras proposicionales. Se utilizarán: ¬, v, Ù , ® , « como conectores y p, q, r, s, t, ... como letras proposicionales. Se utilizarán también los paréntesis como signos impropios.
Las fórmulas de L se construyen siguiendo unas sencillas reglas de formación. Dichas reglas extraen del conjunto de filas de signos del alfabeto aquellas a las que llamamos fórmulas.
La definición de Gramática formal viene dada por la:
Cuádrupla G=( å t, å n, S, P).
Donde:
å t: es el alfabeto de símbolos Terminales.
å n: es el alfabeto de símbolos No Terminales.
S: es el axioma o símbolo inicial de la gramática.
P: es conjunto finito de producciones xAy::=z / x,y,z eå * Aeån.
Permite, por tanto, la especificación formal de las reglas de generación de los programas.
Comparación entre análisis léxico y Sintáctico
Analizador léxico
El analizador léxico es la primera fase de un compilador. Su principal función consiste en leer los caracteres de entrada y elaborar como salida una secuencia de componentes léxicos que utiliza el analizador sintáctico para hacer el análisis.
Analizador sintáctico
Analiza sintácticamente una cadena de tokens para que encontrar para ella el árbol sintáctico o de derivación que tiene como raíz el axioma de la gramática, y como nodos terminales la sucesión ordenada de símbolos que componen la cadena analizada. En caso de no existir este árbol sintáctico, la cadena no pertenecerá al lenguaje, y el analizador sintáctico ha de emitir el correspondiente mensaje de error.
Objetivos del analizador sintáctico (AS)
El AS es la parte principal de un compilador. Las funciones de AS son:
Principales:
Comprobar si el programa es sintácticamente correcto.
Generar las estructuras de datos (árboles sintácticos u otras estructuras) que representan el programa y sirven para el analizador semántico y el generador de código.
En el caso de compilación dirigida por sintaxis -- llamar al analizador semántico y al generador de código.
Otras:
Reaccionar frente a los errores e intentar acotar la propagación de los errores (intentar evitar que un error produzca muchos mensajes de error).
Hacer los siguientes pasos del compilador más independientes de la sintaxis del lenguaje.
Ilustración 1. Funcionamiento de análisis Léxico y Sintáctico
Eliminación de ambigüedad
Una GLC es ambigua si existe una cadena w Є L(G) que tiene más de una derivación por la izquierda o más de una derivación por la derecha o si tiene dos o más arboles de derivación .
En casi de y que toda cadena w Є L (G) tenga un único árbol de derivación no es ambigua.
Ejemplo: La gramática S aS" Sa " a es ambigua porque aa tiene dos derivaciones por la izquierda S Þ aS Þ aa S Þ Sa Þ aa.
Ilustración 2.Arbol de derivación
Tipos de Ambigüedad
Dentro del estudio de gramáticas existen dos tipos fundamentales de ambigüedad, los cuales son:
Ambigüedad Inherente:
Las gramáticas que presentan este tipo de ambigüedad no pueden utilizarse para lenguajes de programación, ya que por más transformaciones que se realicen sobre ellas, nunca se podrá eliminar completamente la ambigüedad que presentan:
Un lenguaje L es inherentemente ambiguo si todas sus gramáticas; si existe cuando menos una gramática no ambigua para L, L no es ambiguo.
El lenguaje de las expresiones no es Ambiguo
Las expresiones regulares no son ambiguas
Ejemplo de un lenguaje inherentemente ambiguo:
Ilustración 3.Lenguaje Inherente
La gramática es ambigua: hay cadenas con más de una derivación más izquierda:
Ilustración 4.Candena de derivación
Eliminación de Recursividad por la izquierda
Una gramática es recursiva por la izquierda si tiene un no terminal A tal que existe una derivación A => Aα para alguna cadena α. Los métodos de análisis sintáctico descendente no pueden manejar gramáticas recursivas por la izquierda, así que se necesita una transformación que elimine la recursión por la izquierda.
Recursión por la izquierda inmediata simple (Eliminación de la recursividad izquierda de las producciones)
En este caso la recursión por la izquierda se presenta solo en las reglas gramaticales
A A α " β
Donde α y β son cadenas de terminales y no terminales y β no comienza en A. Esta regla genera todas las cadenas de la forma β, β α, β α α…Todas las cadenas comienzan con una β, seguida por (0 o mas α). Esta regla gramatical es equivalente a la expresión regular β α
Para eliminar la recursión por la izquierda volvemos a escribir estas reglas gramaticales divididas en dos: una para que primero genere β y otra que genere las repeticiones de α utilizando recursión por la derecha en vez de recursión por la izquierda:
A β A´
A´ α A´"є
Ejemplo Considere de nueva cuenta la regla recursiva izquierda de la gramática de expresión simple:
exp exp opsuma term " term
La forma de esta regla es A A α " β, con A= exp, α=opsuma term y β=term. Al volverla a escribir para eliminar la recursividad por la izquierda obtenemos que
exp term exp´
exp´ opsuma term exp´ "є
Recursión por la izquierda inmediata general (Eliminando la recursión directa por la izquierda de una producción general)
Este es el caso en que tenemos producciones de la forma
A A α " A α "……"A α n " β " β "……… " βm
Donde ninguna β …… βm comienzan con una A. Después se sustituyen las producciones de A por:
A β A´" β A´"……." βm A´
A´ α A´" α A´"……." α n A´"є
Ejemplo. Considere la regla gramatical
exp exp + term " exp - term " term
Eliminemos la recursión por la izquierda de la manera siguiente
exp term exp´
exp + term exp´ " - term exp´ "є
Recursión por la izquierda general (Eliminación de la recursividad izquierda de una gramática completa puede ser mas difícil debido a la recursividad izquierda indirecta).
Es indirectamente recursiva porque elimina por completo la recursividad izquierda
El algoritmo que aquí describimos eliminara sistemáticamente la recursión por la izquierda general de una gramática. Siempre funciona si la gramática no tiene ciclos (donde un ciclo es una derivación de por lo menos un paso que comienza y finaliza con el mismo no terminal: A => A) o producciones є (producciones de la forma A є)
La eliminación de la recursión por la izquierda no cambia el lenguaje que se esta reconociendo, pero modifica la gramática y, en consecuencia, también los arboles de derivación.
Conclusión
El analizador como su nombre lo dice es requerido para analizar una sintaxis, el cual nos podremos ir dando cuenta al momento de ejecutar su función, en el desarrollo de este proyecto.
Bibliografía
(ANTONIO REYES OSCAR, 2010)
(Santos, 2011)
(Ruben, 2011)