Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Análisis sintáctico
Gramáticas libres de contexto
Objetivos
› Conocer los lenguajes libres de contexto
› Conocer las responsabilidades del analizador sintáctico
› Aprender a utilizar gramáticas libres de contexto
› Aprender a diseñar gramáticas libres de contexto
› Aprender a reconocer y resolver fuentes de ambigüedad
› Aprender a eliminar la recursividad por la izquierda
› Aprender a factorizar por la izquierda
› Conocer el uso y tipos de derivaciones y árboles sintácticos
› Conocer la representación de lenguajes mediante diagramas de sintaxis
› Presentar los diferentes tipos de autómatas utilizados para construir analizadores sintácticos
› Discutir los diferentes tipos de analizadores sintácticos
Índice
› Introducción
› Gramáticas libres de contexto
› Notación BNF y EBNF
› Derivación gramatical
› Árboles sintácticos
› Limpieza gramatical
› Ambigüedad gramatical
› Recursividad por la izquierda
› Factorización por la izquierda
› Diagramas de sintaxis
› Autómatas a pila deterministas
› Bibliografía
Análisis sintáctico
La fase de análisis sintáctico tiene por objetivo solicitar tokens al analizador léxico y
construir una representación arborescente de todo el código fuente. Este proceso se
encuentra dirigido por el conocimiento gramatical que del lenguaje tiene el analizador
sintáctico
... Tema 3
<DO, PR>
<), PD> ¿Cómo se especifica formalmente
un analizador sintáctico?
<b, ID>
<>, GT> › Formalismos
<a, ID> › Tratamiento de formalismos
<(, PI>
Foco de atención <WHILE, PR> › Conversión entre formalismos
El analizador sintáctico va
pidiendo nuevos tokens al Analizador sintáctico Temas 4 y 5
analizador léxico para construir
un árbol del programa fuente ¿Cómo se implementa un
analizador sintáctico?
SWhile › Estrategias análisis sintáctico
› Tipos de gramáticas
WHILE E DO S
› Tipos de analizadores
E > E
Pascal
Ejemplo
El lenguaje Pascal tiene unas normas de Uses crt;
carácter gramatical que definen su var
naturaleza y expresividad. Visto de cantidad,cont,numero,s:integer;
uses …
manera extensiva, el lenguaje Pascal begin crt;
sería el conjunto infinito de todos los clrScr; var
Uses crt;
posibles códigos fuente correctos s:=0; contador:integer;
var
write('Cantidad:');
begin
escritos en sintaxis Pascal suma,numero,contador:integer;
read(canditad);
ClrScr; begin
for cont:=1
fortocontador:=2
cantidad doto 999 do
clrScr;
begin begin
write('Numero: ');
write('Numero ',cont,': ');
contador:=contador+1;
readln(numero);
Read(numero);
Write(contador,',
suma:=0; ');
s:=s+numero;
if contador>999 then
for contador:=1 to numero do
end; begin contador:=999;
begin
write('Promedio:',s/cantidad:0:2);
end; suma:=suma + contador;
readKey; end;
end;
end;. ReadKey; write('Suma: ',suma);
end. readKey;
end.
Lenguajes
libres de
contexto
Diagramas de Autómatas
sintaxis a pila
Notación
Notación estándar
E→E+E
Las reglas se escriben como A → X.
E→E–E
Cada regla se escribe en una linea
distinta E → id
Notación BNF
¿Cómo se escriben D ::= T L
atención
Foco de
Las reglas se escriben como A ::= X.
las reglas? Las reglas de un mismo antecedente T ::= int | bool | char
se escriben como A ::= X | Y | Z…
Cada regla con antecendente distinto L ::= id , L | id
se escribe en una nueva línea
Derivación gramatical
Se plantea el siguiente problema de decisión: Dado un lenguaje descrito a
L = Lenguaje de operadores
través de una gramática G, L(G) determinar si la colección de terminales x
pertenece o no al lenguaje al mismo. Esto es ¿x Є L (G)? Sea G = (T, N A, P) con
T = {+, -, *, /, n}
2+3*5 Cadena de N = {E}
derivación
P={
E ::= E + E
axioma asidero
E ::= E - E
(2) (3) (5)
E ::= E * E
E→E+E→n+E→n+E*E→n+n*E→n+n*n
E ::= E / E
Paso de Forma Frase E ::= n
derivación de frase }
Derivación gramatical
Se plantea el siguiente problema de decisión: Dado un lenguaje descrito a
través de una gramática G, L(G) determinar si la colección de terminales x
pertenece o no al lenguaje al mismo. Esto es ¿x Є L (G)?
Derivación gramatical
Se plantea el siguiente problema de decisión: Dado un lenguaje descrito a
través de una gramática G, L(G) determinar si la colección de terminales x
pertenece o no al lenguaje al mismo. Esto es ¿x Є L (G)?
E
SIf *
IF
E * E
+ n
IF ( E ) THEN S ELSE S
> := :=
( E ) n
E > E n n
ID ID ID ID ID ID
E + E
(2 + 3) * 5
If (a>b) then a:=b else b:=a If (a>b) then a:=b else b:=a
n n
(2 + 3) * 5 SWhile WHILE
WHILE ( E ) DO S > ++
E > E ID ID ID
Ejercicios
› L1. Declaración de variables en Pascal L5 Sentencia ::= BloqueSentencias |
› L2. Declaración de estructuras en C SentenciaIf |
› L3. Declaración de procedimientos en Pascal Sentencia While
› L4. Declaración de procedimientos en C BloqueSentencias ::= { listaSentencias }
› L5. Declaración de sentencias en C listaSentencias ::= sentencia ; ListaSentencias |
› L6. Declaración de sentencias en Pascal
› L7. Sentencia for en C SentenciaIf ::= …
› L8. Sentencia Repeat – Until en Pascal SentenciaWhile ::= …
Limpieza gramatical
Para no tener problemas en la construcción de analizadores sintácticos es
conveniente aplicar ciertas operaciones de trasformación gramatical. Estos problemas
son:
Eliminación de la ambigüedad
Es necesario eliminar las expresiones gramaticales que
generen una interpretación potencialmente gramatical
ambigua
Eliminación de la recursividad a izquierdas
Limpieza
gramatical En algunos casos las reglas con recursividad a
izquierdas de la forma A ::= A α pueden acarrear
problemas en la construcción de analizadores
Factorización por la izquierda
Las reglas con partes comunes a la izquierda de los
consecuentes pueden también generar problemas, en
función del analizador que se construya
E
E ¿Cuál es el problema?
n n n n
(3) (5) (2) (3)
Gramáticas con ciclos Caminos alternativos Reglas recursivas con ε en casos base
S := A S ::= HRS
S ::= A
S := B S ::= s
S ::= a
A := B H ::= h|ε
A ::= S
R ::= r|ε
Corrección explicita
La resolución explicita
Se mantiene la gramática ambigua pero hace escoger este árbol
se añaden criterios para indicar al gramatical
compilador el árbol sintáctico que debe
construir en cada caso
Corrección de la Alteración gramatical
ambigüedad Dos gramáticas son
gramatical Se modifica la gramática para conseguir
equivalentes si
otra equivalente que no presente reconocen el mismo
ambigüedad. lenguaje
Ambigüedad no esencial
Hay situaciones en las que la ambigüedad
no presenta problemas para construir
analizadores sintácticos
2+3*5
Gramática de operadores
La gramática canónica de operadores es
inherentemente ambigua ya que no se (2 + 3) * 5 2 + (3 * 5)
sabe el orden en que deben aplicarse los
operadores
Estudio de
casos típicos El problema del else ambiguo If (a>b) if (c>d) c++; else d++;
de ambigüedad
Cuando se anidan una sentencia if con
otra if–else es imposible saber a qué if
If (a>b) { If (a>b) {
emparejar el else.
if (c>d) c++; if (c>d) c++;
else d++; }
} else d++;
+ precedencia -
Se ordena en una tabla los niveles de + – E
prioridad. Para cada nivel se define un
* /
nuevo no terminal. Cada nivel incrementa
E + T
en 1 la distancia al axioma ( ) n
E ::= E + E Gramática de T T * F
operadores no ambigua
E ::= E – E
E ::= E * E E ::= E + T | E– T | T n
F F
E ::= E / E T ::= T * F | T / F | F (5)
E ::= ( E ) F ::= ( E ) | n
n n
E ::= n
(2) (3)
E ::= E + T | E– T | T T F n n F * T
(5) (2)
T ::= F * T | T / F | F n n F
F
F ::= ( E ) | n (3) (3)
n
n
(5)
(2)
Sentencia
sentencia ::= sentenciaIf | otra
sentenciaIf ::= IF ( exp ) sentencia | SentNoEmparejada
IF ( exp ) sentencia ELSE sentencia
IF ( exp ) sentencia
Recursividad indirecta
A ::= αA’ | γ
A’ ::= β1 | β2 | … | βn
E T
+ E ::= E + T |
T
E-T |
-
T
T F T ::= T * F |
* T/F |
F F
/ F ::= ( E ) |
n
n
F
La equivalencia entre gramáticas
y diagramas de sintaxis resulta
( E ) evidente
donde
› T es un alfabeto de símbolos terminales de entrada
x, y
› P es un alfabeto de estados de la pila
› Q es un conjunto de estados finito no vacío 0 A 1
Pila de estados
A0 Є P es el simbolo inicial en la pila
›
A B
q0 Є Q es un estado inicial o estado de arranque
›
B 2 x
› f: Q x T U { } x P → Q x P una función de transición C
› F C Q es un subconjunto de estados finales de aceptación Máquina de estados
elemento de la entrada (x), la cima de la pila (A) y transitar desde
el estado en curso (0) a un nuevo estado (1) apilando un nuevo
estado en la cima de la pila x, y
Reconocimiento de lenguajes 0 A 1
Pila de estados
Reconocimiento por estados finales
Se reconoce una frase si tras una A B
Material de estudio
Bibliografía básica
Material de estudio
Bibliografía complementaria