Está en la página 1de 12

República Bolivariana de Venezuela

Ministerio del Poder Popular para la Educación Universitaria

Universidad José Antonio Páez

Facultad de Ingeniería

Análisis sintaxis, árboles, ambigüedad, asociatividad y

precedencia de operadores.

Docente

Integrantes:

Susan León Fernando Rodríguez

27.589.678

Sebastian Salazar

28.465.047

Omaris Carreño 27.927.570


7mo semestre sección 307C1

San Diego, 11 de noviembre de 2022

Introducción

El objetivo de este trabajo es brindar al lector una pequeña reseña de lo que el


compilador hace desde que toma una cadena de entrada hasta que la lleva a
evaluar las reglas semánticas, que es una parte importante del proceso de
compilación en un lenguaje de programación.

Un compilador utiliza gramáticas independientes de contexto como guía para la


traducción de lenguajes, si logra de alguna manera asociar información a las
distintas construcciones del lenguaje de programación proporcionando atributos
a los símbolos de la gramática, puede entonces calcular sus valores mediante
reglas semánticas.

Aunque hay dos maneras de hacer la asociación entre reglas semánticas y


producciones, que son mediante definiciones dirigidas por sintaxis y esquemas
de traducción, nos interesa particularmente ésta última, pues con éstas se
trabaja más pues se puede definir el orden en que se ejecutan las acciones y
las evaluaciones de los atributos.
TRADUCCIÓN DIRIGIDA POR LA SINTAXIS

El principio de traducción dirigida por la sintaxis establece que el significado de


una construcción está directamente relacionado con su estructura sintáctica,
que a su vez está representada en su árbol de análisis sintáctico. En este
proceso de traducción dirigida por la sintaxis se asocia información a una
construcción del lenguaje proporcionando atributos a los símbolos de la
gramática que representan la construcción.

Existen dos tipos de notaciones que permiten asociar reglas semánticas con
reglas de producción:

 Definiciones dirigidas por la sintaxis.


 Esquemas de traducción.

Entre otras características diferenciales entre ambos tipos de notaciones, se


puede destacar que con las definiciones dirigidas por la sintaxis se ocultan
muchos detalles de la implementación y no es necesario que el usuario
especifique explícitamente el orden en el que tiene lugar la ejecución de las
acciones. Con esquemas de traducción sí se indica el orden en el que tiene
lugar la traducción, el orden en que se deben evaluar las reglas semánticas y
algunos detalles de la implementación sí son visibles.

Sintaxis:

El análisis sintáctico o parsing es la segunda fase, es decir, después del


análisis léxico. Comprueba la estructura sintáctica de la entrada dada, es decir,
si la entrada dada está en la sintaxis correcta (del idioma en el que se ha
escrito la entrada) o no. Lo hace mediante la construcción de una estructura de
datos, llamada árbol de análisis o árbol de sintaxis. El árbol de análisis se
construye utilizando la gramática predefinida del idioma y la string de entrada.
Si la string de entrada dada se puede producir con la ayuda del árbol de
sintaxis (en el proceso de derivación), la string de entrada se encuentra en la
sintaxis correcta. de lo contrario, el analizador de sintaxis informa del error.

Arboles:

Arboles de reconocimiento sintáctico

Un árbol de análisis sintáctico es una representación gráfica de una derivación


que filtra el orden en el que se aplican las producciones para sustituir los no
terminales. Cada nodo interior de un árbol de análisis sintáctico representa la
aplicación de una producción.{Ejemplo de árbol sintáctico}Las hojas de un árbol
de análisis sintáctico se etiquetan mediante no terminales o terminales y ,leídas
de izquierda a derecha constituyen una forma de frase, a la cual se le llama
producto o frontera del árbol

Arboles de derivación

Un árbol de derivación permite mostrar gráficamente cómo se puede derivar


cualquier cadena de un lenguaje a partir del símbolo distinguido de una
gramática que genera ese lenguaje.
Ambigüedad:

Se dice que una gramática G es ambigua si tiene más de un árbol de análisis


(derivación izquierda o derecha) para al menos una cadena.

Ejemplo:

E→E+E

E→E–E

E → id

Para la cadena id + id - id, la gramática anterior genera dos árboles de análisis:

La ambigüedad en la gramática no es buena para la construcción de un


compilador. Ningún método puede detectar y eliminar la ambigüedad
automáticamente, pero puede eliminarse reescribiendo toda la gramática sin
ambigüedad o estableciendo y siguiendo las restricciones de asociatividad y
precedencia.
Asociatividad

Si un operando tiene operadores en ambos lados, el lado en el que el operador


toma este operando se decide por la asociatividad de esos operadores. Si la
operación es asociativa a la izquierda, entonces el operador de la izquierda
tomará el operando o si la operación es asociativa a la derecha, el operador de
la derecha tomará el operando.

Precedencia

Si dos operadores diferentes comparten un operando común, la precedencia de


los operadores decide cuál tomará el operando. Es decir, 2 + 3 * 4 puede tener
dos árboles de análisis sintáctico diferentes, uno correspondiente a (2 + 3) * 4 y
otro correspondiente a 2+ (3 * 4). Al establecer la precedencia entre los
operadores, este problema se puede eliminar fácilmente. Como en el ejemplo
anterior, matemáticamente * (multiplicación) tiene prioridad sobre + (suma), por
lo que la expresión 2 + 3 * 4 siempre se interpretará como:

2 + (3 * 4)

Estos métodos reducen las posibilidades de ambigüedad en un idioma o su


gramática.

Análisis sintáctico por descendiente recursivo

Se puede considerar el análisis sintáctico descendente como un intento de


encontrar una derivación por la izquierda para una cadena de entrada También
se puede considerar como un intento de construir un árbol de análisis sintáctico
para la entrada comenzando desde la raíz y creando los nodos del árbol en
orden previo.
El descenso recursivo, puede incluir retrocesos, es decir, varios exámenes de
la entrada. Sin embargo, no hay muchos analizadores sintácticos con
retroceso. En parte, porque casi nunca se necesita el retroceso para analizar
sintácticamente las construcciones de los lenguajes de programación. En casos
como el análisis sintáctico del lenguaje natural, el retroceso tampoco es muy
eficiente, y se prefieren los métodos tabulares, como el algoritmo de
programación dinámica o el método de Earley (1970).

Características:

 Es un método fácil de implementar.


 Genera una función por cada símbolo no terminal.
 Si las producciones son recursivas, entonces la función correspondiente
es recursiva.
 Es llamado también análisis descendente recursivo.
 Sólo funciona con gramáticas LL(1)

TRADUCTOR DE EXPRESIONES

Sintaxis abstracta y concreta: un punto de partida útil para considerar la


traducción de una cadena de entrada es un árbol de sintaxis abstracta, donde
cada nodo representa un operador, y los hijos de ese nodo, los operandos. Por
contraste, un árbol de análisis sintáctico se denomina árbol de sintaxis
concreta, y la gramática subyacente, sintaxis concreta del lenguaje. Los árboles
de sintaxis abstracta, o simplemente arboles sintácticos difieren de los árboles
de análisis sintáctico en que las distinciones superficiales de forma, sin
importancia en la traducción, no aparecen en los árboles sintácticos.

Ejemplo:

El árbol sintáctico para 9-5+2 se muestra a continuación, dado que + y – tiene


el mismo nivel de precedencia, y los operadores con igual nivel de precedencia,
se evalúan de izquierda a derecha, el árbol presenta 9-5 agrupado como una
buena expresion.
ANÁLISIS LÉXICO

El Análisis Léxico es la primera fase de un compilador y consiste en un


programa que recibe como entrada el código fuente de otro programa
(secuencia de caracteres) y produce una salida compuesta de tokens
(componentes léxicos) o símbolos. Estos tokens sirven para una posterior
etapa del proceso de traducción, siendo la entrada para el Análisis Sintáctico.

La especificación de un lenguaje de programación a menudo incluye un


conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente
en expresiones regulares que indican el conjunto de posibles secuencias de
caracteres que definen un token o lexema.

En algunos lenguajes de programación es necesario establecer patrones para


caracteres especiales (como el espacio en blanco) que la gramática pueda
reconocer sin que constituya un token en sí.
Función del Analizador Léxico

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. En la figura 1 se puede apreciar el esquema
de una interacción que se aplica convirtiendo el analizador léxico en una
subrutina o corrutina del analizador sintáctico. Recibida la orden "obtener el
siguiente componente léxico" del analizador sintáctico, el analizador léxico lee
los caracteres de entrada hasta que pueda identificar el siguiente componente
léxico.

Tabla de símbolos:

La tabla de símbolos es una es una estructura de datos que nos permite


realizar operaciones de inserción, búsqueda y eliminación de información en
varias construcciones del lenguaje fuente, la cual es analizada por el
compilador originándose un código abierto.

Un compilador utiliza una tabla de símbolos para llevar un registro de la


información sobre el ámbito y el enlace de los nombres. Se examina la tabla de
símbolos cada vez que se encuentra un nombre en el texto fuente. Si se
descubre un nombre nuevo o nueva información sobre un nombre ya existente,
se producen cambios en la tabla.
Es útil que un compilador pueda aumentar dinámicamente, la tabla de símbolos
durante la compilación. Si la tabla de símbolos tiene tamaño fijo al escribir el
compilador, entonces el tamaño debe ser lo suficientemente grande como para
albergar cualquier programa fuente. Es muy probable que dicho tamaño sea
demasiado grande para la mayoría de los programas e inadecuado para
algunos.

Ejemplo de tabla de símbolos en lenguaje C

La tabla de símbolos es una estructura de datos que se crea en tiempo de


traducción del programa fuente. Es como un diccionario variable, debe darle
apoyo a la inserción, búsqueda y cancelación de nombres (identificadores) con
sus atributos asociados, representando las vinculaciones con las
declaraciones. Debe aclararse que no necesariamente deberá estar
representada en una tabla como su nombre indica ya que también se emplean
árboles, pilas, etc.

Los símbolos se guardan en la tabla con su nombre y una serie de atributos


opcionales que dependerán del lenguaje y de los objetivos del procesador, este
conjunto de atributos almacenados se denomina registro de la tabla de
símbolos.

La siguiente representa una serie de atributos que no es necesaria para todos


los compiladores, sin embargo, cada uno de ellos se puede utilizar en la
implementación de un compilador particular.

 Nombre del identificador.


 Dirección en tiempo de ejecución a partir del cual se almacenará el
identificador si es una variable.
 Tipo del identificador. Si es una función, el tipo que devuelve la función.
 Número de dimensiones del array (arreglo), o número de miembros de
una estructura o clase, o números de parámetros si se trata de una
función.
 Tamaño máximo o rango de cada una de las dimensiones de los array,
si tiene dimensión estática.
 Etc.

MÁQUINA DE PILA ABSTRACTA

Una máquina de pila es un modelo computacional en el cual la memoria de la


computadora toma la forma de una o más pilas. El término también se refiere a
un computador real implementando o simulando una máquina de pila
idealizada.

Adicionalmente, puede referirse también a una máquina verdadera o simulada


con un conjunto de instrucciones de "0 operandos". En tal máquina, la mayoría
de las instrucciones implícitamente operan en valores en el tope de la pila y
reemplazan esos valores por el resultado. Típicamente tales máquinas también
tienen una instrucción "load" y una instrucción "store" que leen y escriben a
posiciones arbitrarias de la RAM. (Como el resto de las instrucciones, las
instrucciones "load" y "store" no necesitan ningún operando en una máquina de
pila típica - ellas siempre toman la dirección de la RAM que se quiere leer o
escribir desde el tope de la pila).
BIBLIOGRAFIA

https://es.wikipedia.org/wiki/M%C3%A1quina_de_pila

https://www.gestiopolis.com/traductor-traves-la-fase-lexica-la-metodologia-
compiladores/

https://sites.google.com/site/compiladoresesilval/home/compiladores/analisis-
lexico

http://seminariodecompiladoresii.blogspot.com/p/un-traductor-para-
expresiones-simples.html

También podría gustarte