Está en la página 1de 12

INSTITUTO TECNOLOGICO SUPERIOR

DE MISANTLA

CARRERA: ING.SISTEMAS COMPUTACIONALES

SEMESTRE: 6 SEMESTRE

MATERIA: LENGUAJES Y AUTOMATAS 1

DOCENTE: ELSA IRENE HERRERA SANTIAGO

ALUMNO (A): EFREN MENDEZ HERNANDEZ

TRABAJO: APUNTES UNIDAD 6

FECHA: 25/04/2015

Anlisis Sintctico.
6.1 GLC.
Gramticas Libres de Contexto (GLC), o de tipo 2: las reglas son de la forma X
, donde X es una variable y es una cadena que puede contener variables y
constantes. Estas gramticas producen los lenguajes Libres de Contexto
(abreviado LLC)

Capturan la nocin de constituyente sintctico y la nocin de orden.

Herramienta formal que puede ser vista tanto desde un punto de vista
generador como estructurador.

Propiedades computacionales interesantes: se puede reconocer en tiempo


polinmico.

Una Gramtica Libre de Contexto es una tupla con 4 parmetros:

G = (V, T, P, S)

V conjunto de smbolos variables

T conjunto de smbolos terminales

S V, smbolo inicial

P conjunto de reglas de produccin: A , con sucesin de smbolos


de V U T, eventualmente vaca ( = )

Una GLC es un dispositivo generador.


Definimos el lenguaje LG generado por una gramtica G del siguiente modo: G = {
w / S * w } , siendo * una especie de clausura transitiva de y w una tira de
terminales
6.2 rbol de derivacin.

Es una representacin grfica (en forma de rbol invertido) de un proceso de


derivacin en una gramtica. Se define el rbol de derivacin como sigue:

la raz del rbol ser el smbolo inicial de la gramtica

los nodo interiores del rbol estn etiquetados por los smbolos no
terminales

las hojas estn etiquetadas por smbolos terminales

si un nodo interior etiquetado por A, posee como hijos los nodos


etiquetados por X1,X2, Xn , entonces A X1,X2, Xn es una produccin
de la gramtica, en donde Xi , representa smbolo terminal o no terminal.

Sea la siguiente gramtica:


G=( ={a, b}, N={S,A,B},S P ) P: SaABAa , A |aA , B|bB la construccin de
un rbol de derivacin en el proceso de la generacin de la palabra aa es el
siguiente:

Propiedades

de

un

rbol

de

derivacin.

Sea G = (N, T, S, P) una gramtica libre de contexto, sea A N una variable.


Diremos que un rbol TA= (N, E) etiquetado es un rbol de derivacin asociado a
G si verifica las propiedades siguientes:

La raz del rbol es un smbolo no terminal

Cada hoja corresponde a un smbolo terminal o .

Cada nodo interior corresponde a un smbolo no terminal.

Para cada cadena del lenguaje generado por una gramtica es posible construir
(al menos) un rbol de derivacin, en el cual cada hoja tiene como rtulo uno de
los smbolos de la cadena.

rbol

de

derivacin.

Ejemplo:
Sea

G=(N,

T,

S,

P)

una

GLC

con

P:

ab|aSb

La derivacin de la cadena aaabbb ser: S aSb aaSbb aaabbb y el rbol


de derivacin:

6.3

Formas

normales

de

Chomsky.

Una gramtica formal est en Forma normal de Chomsky si todas sus reglas de
produccin
son
de
alguna
de
las
siguientes
formas:
A

BC

donde A, B y C son smbolos no terminales (o variables) y es un smbolo


terminal.
Todo lenguaje independiente del contexto que no posee a la cadena vaca, es
expresable por medio de una gramtica en forma normal de Chomsky (GFNCH) y
recprocamente. Adems, dada una gramtica independiente del contexto, es
posible algortmicamente producir una GFNCH equivalente, es decir, que genera
el
mismo
lenguaje.
Sea G = ( N, T, P, $) una gramtica con P N X (N U T)* y X N un
smbolo no-terminal (o una variable). Podemos clasificar tales smbolos X en tres
clases:
Variables accesibles:

Si existe una derivacin desde el smbolo inicial que contiene X, es decir,


existe $ * X donde , *

Variables generativas:

Si existe una derivacin desde el la variable que produce una sentencia , es


decir, existe X * donde *T.

Variables tiles:

6.4

Si existe una derivacin desde el smbolo inicial usando que produce una
sentencia , es decir, existe $ * X * donde , * y *T.
Diagramas

de

sintaxis

Los diagramas sintcticos, de sintaxis o diagramas del ferrocarril son una forma de
representar una gramtica libre de contexto. Representan una alternativa grfica
para la Forma de Backus-Naur (BNF, por sus siglas en ingls) o la Forma
Extendida
de
Backus-Naur
(EBNF, por
sus
siglas
en
ingles).
Los diagramas de ferrocarril son ms comprensibles para la mayora de la gente.
Alguna parte de la popularidad del formato de intercambio de datos JSON se debe
a
su
representacin
en
los
diagramas
de
ferrocarril.
Un segundo mtodo alternativo para desplegar las producciones de ciertas
gramticas de tipo 2 es el diagrama de sintaxis. sta es una imagen de las
producciones que permite al usuario ver las sustituciones en forma dinmica, es
decir, verlas como un movimiento a travs del diagrama. En la figura 10.5 se
ilustrar los diagramas que resultan de la traduccin de conjuntos de producciones

tpicos, que son, por lo general, todas las producciones que aparecen en el lado
derecho de algn enunciado BNF.

6.5

Eliminacin

de

la

ambigedad

Una GLC es ambigua si existe una cadena w L(G) que tiene ms de una
derivacin por la izquierda o ms de una derivacin por la derecha o si tiene dos o
ms
arboles
de
derivacin
.
En casi de y que toda cadena w L (G) tenga un nico rbol de derivacin no es
ambigua.
Ejemplo: La gramtica S aS| Sa | a es ambigua porque aa tiene dos
derivaciones por la izquierda S aS aa S Sa aa.

Tipos

de

Ambigedad

Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad,


los
cuales
son:
Ambigedad

Inherente:

Las gramticas que presentan este tipo de ambigedad no pueden utilizarse para
lenguajes de programacin, ya que por ms transformaciones que se realicen
sobre ellas, nunca se podr eliminar completamente la ambigedad que
presentan:
Un lenguaje L es inherentemente ambiguo si todas sus gramticas; si existe
cuando menos una gramtica 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:

La gramtica es ambigua: hay cadenas con ms de una derivacin ms izquierda:

6.6

Generacin

de

matriz

predictiva

(clculo

first

follow)

FIRST: Sea G := (V; ; Q0; P) una gramtica libre de contexto. Para cada forma
sentencial (V U )* y para cada k N definiremos la funcin.

En otras palabras, el operador F IRST k asocia a cada forma sentencial los


primeros k smbolos de cualquier forma terminal alcanzable desde mediante
derivaciones
masa
la
izquierda".
FOLLOW: Con las mismas notaciones anteriores, para cada forma sentencial
(V U )* definiremos la funcin FOLLOWG GK () del modo siguiente.

De nuevo nos ocuparemos solamente de FOLLOW: = FOLLOW1. Obsrvese que


FOLLOW k () * y que para cada x FOLLOW (), Ixl k. Obsrvese que
para cada variable A V, FOLLOW(A) son todos los smbolos terminales que
pueden aparecer a la derecha de A en alguna forma sentencial de la gramtica.
6.7
Analizador

Tipos

de

analizadores

sintcticos
Descendente:

Se construye el rbol de anlisis sinttico partiendo del smbolo inicial y aplicando


las producciones mediante derivaciones por la izquierda, el smbolo a expandir es
el
que
esta
mas
a
la
izquierda.
Analizador

Ascendente:

Se construye el rbol de anlisis sinttico partiendo de la frase a reconocer y


aplicando las producciones mediante reducciones hasta llegar al smbolo inicial de
la gramtica.
Ejemplo:
G= ({+,*, ID, (,)}, {E, T, P},E, P)P={E:=E+T | T; T:=T*P | P; P:= ID | (E) }FraseID +
(
ID
*
ID
)
Ejemplo:
G= ({+,*, ID, (,)}, {E, T, P},E, P)P={E:=E+T | T; T:=T*P | P; P:= ID | (E) }FraseID +
( ID * ID )

6.8

Manejo

de

errores.

Un compilador es un sistema que en la mayora de los casos tiene que manejar


una entrada incorrecta. Sobre todo en las primeras etapas de la creacin de un
programa, es probable que el compilador se utiliza para efectuar las
caractersticas que debera proporcionar un buen sistema de edicin dirigido por la
sintaxis, es decir, para determinar si las variables han sido declaradas antes de
usarla,
o
si
faltan
corchetes
o
algo
as.
Por lo tanto, el manejo de errores es parte importante de un compilador y el
escritor del compilador siempre debe tener esto presente durante su diseo.
Hay que sealar que los posibles errores ya deben estar considerados al disear
un lenguaje de programacin. Por ejemplo, considerar si cada proposicin del
lenguaje de programacin comienza con una palabra clave diferente (excepto la
proposicin de asignacin, por supuesto). Sin embargo, es indispensable lo
siguiente:
El compilador debe ser capaz de detectar errores en la entrada;

El compilador debe recuperarse de los errores sin perder demasiada


informacin;

Y sobre todo, el compilador debe producir un mensaje de error que permita


al programador encontrar y corregir fcilmente los elementos
(sintcticamente) incorrectos de su programa.

Errores

Sintcticos.

Muchos errores de naturaleza sintctica Recuperacin: Al producirse un error el


compilador debe ser capaz de informar del error y seguir compilando. (Ideal).
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de
la creacin de compiladores. Nos interesa que cuando el compilador encuentre un
error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de
un analizador sintctico debe tener como objetivos:

Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su


localizacin.

Recuperarse del error, para poder seguir examinando la entrada.

No ralentizar significativamente la compilacin.

Un buen compilador debe hacerse siempre teniendo tambin en mente los errores
que se pueden producir; con ello se consigue:

Simplificar la estructura del compilador.

Mejorar la respuesta ante los errores.

Errores semnticos.
Un lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los
programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se
detectarn
siempre
en
tiempo
de
compilacin.
Como mnimo, ante un error, un comprobador de tipos debe informar de la
naturaleza y posicin del error y recuperarse para continuar con la comprobacin
del
resto
del
programa
a
analizar.
Veamos algunas de las operaciones a tener en cuenta en una comprobacin de
tipos:

Conversin de tipos: A veces es necesario transformar el tipo de una


expresin para utilizar correctamente un operador o para pasar de forma
adecuada un parmetro a una funcin.

Coercin: Es una conversin de tipos que realiza de forma implcita el


propio compilador. Si es el programador el que realiza la conversin se
tratar entonces de una conversin explcita.

Sobrecarga de operadores: La sobrecarga se resuelve determinando el tipo


de cada una de las expresiones intervinientes en la sobrecarga.

Funciones polimrficas: Son aquellas que trabajan con argumentos cuyo


tipo puede cambiaren distintas llamadas a la funcin.

6.9

Generadores

de

analizadores

sintcticos

ANTLR:
(ANother Tool for Language Recognition; en espaol "otra herramienta para
reconocimiento de lenguajes") es una herramienta creada principalmente por
Terence Parr, que opera sobre lenguajes, proporcionando un marco para construir
reconocedores (parsers), intrpretes, compiladores y traductores de lenguajes a
partir de las descripciones gramaticales de los mismos (conteniendo acciones
semnticas
a
realizarse
en
varios
lenguajes
de
programacin).
GNU bison:
Es un programa generador de analizadores sintcticos de propsito general
perteneciente al proyecto GNU disponible para prcticamente todos los sistemas
operativos, se usa normalmente acompaado de flex aunque los analizadores
lxicos
se
pueden
tambin
obtener
de
otras
formas.
Grammatica:
Es un generador de analizadores sintcticos de C# y Java libre. Es similar a otras
herramientas como Yacc o ANTLR. Grammatica soporta el algoritmo LL(k) para
gramticas con un nmero ilimitado de tokens de anticipacin. Est bastante bien
probado, y ha sido auto compilado desde la versin 0.1. La documentacin
contiene una lista completa de caractersticas, as como una comparacin con
otros
generadores
de
analizadores.
JavaCC:
(Java Compiler Compiler) es un generador de analizadores sintcticos de cdigo
abierto para el lenguaje de programacin Java. JavaCC es similar a Yacc en que
genera un parser para una gramtica presentada en notacin BNF, con la

diferencia de que la salida es en cdigo Java. A diferencia de Yacc, JavaCC


genera analizadores descendentes (top-down), lo que lo limita a la clase de
gramticas LL (K) (en particular, la recursin desde izquierda no se puede usar). El
constructor de rboles que lo acompaa, JJTree, construye rboles de abajo hacia
arriba
(bottom-up).
Yacc:
Es un programa para generar analizadores sintcticos. Las siglas del nombre
significan Yet Another Compiler-Compiler, es decir, "Otro generador de
compiladores ms". Genera un analizador sintctico (la parte de un compilador
que comprueba que la estructura del cdigo fuente se ajusta a la especificacin
sintctica del lenguaje) basado en una gramtica analticaescrita en una notacin
similar a la BNF. Yacc genera el cdigo para el analizador sintctico en el Lenguaje
de programacin C.

También podría gustarte