Vous êtes sur la page 1sur 58

Diagrama de Sintaxis

Sintxis
Conjunto de reglas que determinan si las sentencias de un programa estn bien formadas o no.

Cmo se describe la sintaxis?


La sintaxis se define formalmente usando una gramtica de contexto libre. Una gramtica consiste de las reglas que permiten construcciones sintcticamente correctas en un lenguaje. Tres notaciones son usadas comnmente para describir la sintaxis:

Forma Backus-Naur (BNF) BNF extendido Diagramas de sintaxis

TIPOS DE GRAMATICAS

Tipos de gramticas Las gramticas ms sencillas son las gramticas regulares, debido a que no presentan anomalas de ningn tipo. Desafortunadamente este tipo de gramticas no permiten expresar todos los lenguajes posibles y en especial los humanos por lo que se necesitan otros tipos de gramticas. Las ms utilizadas en informticas son las libres del contexto. Gramticas Regulares Son las que se forman a travs de Autmatas Finitos Deterministas y Expresiones regulares. No presentan ambiguedades.

GRAMATICAS

Gramticas Son un formalismo matemtico que permite decidir si una cadena pertenece a un lenguaje dado. Se define como la cuarteta G= (N, , S, P), en donde N es el conjunto de smbolos terminales, es conjunto de smbolos terminales, S es el smbolo inicial (S pertenece a N) y P es un cojunto de reglas de produccin. Gramticas Los smbolos no terminales (N) son aquellos que pueden seguir derivando en otros; mientras que los terminales el proceso finaliza all.

Descripcin de las gramticas


Gramticas Regulares (tipo 3 o G3): el conjunto de reglas es un

subconjunto finito de (V ) [(V ) ), es decir:


El lado izquierdo consiste slo de una variable. El lado derecho consiste de

Un smbolo terminal seguido de una variable Slo un smbolo terminal La cadena vaca.

Ejemplo: A aB | a |
Gramticas Libres de Contexto, GLC, (tipo 2 o G2): el conjunto

de reglas es un subconjunto finito de (V ) V*, es decir:


El lado izquierdo consiste slo de una variable.

No hay restricciones para el lado derecho.

Ejemplo: S aSb | ab |

Diagramas Sintcticos
Constituyen un mtodo de descripcin de lenguajes, equivalente a la BNF, originalmente para definir sintxis de Pascal.

Diagramas Sintcticos Pascal


Sentencia Asignacin:
Identificador

:=

Exp

Sentencia if:
If
Exp B

then

Sentencia else Sentencia

Sentencia while:
While
Exp B

do

Sentencia

Arbol de Parseo
Representacin grfica de la estructura parseada
Muestra la secuencia de derivaciones efectuada Nodos internos son no-terminales Hojas son terminales Cada nodo padre es el lado izquierdo (LHS) y los hijos son el lado derecho (RHS) de una produccin

Entrada y Salida de un Parser


Entrada: - (123.3 + 23.6)
Token Stream
minus_op

Arbol de Parseo

Analizador Sintctico (Parser)

left_paren_op
num(123.3) plus_op num(23.6) right_paren_op

( )

123.3

23.6

+
Universidad Galileo

Oscar Bonilla

10

Arboles de Parse (cont.)

Este es el parse tree para el string The dog eats bones (gramtica #1):
<sentence>

<subject>

<predicate>

<article>

<noun>

<verb>

<object>

The

dog

eats

bones

Arboles de Parse (cont.)

Aqu muestro qu pasa se se intenta construir un parse tree para el string -.3 (gramtica #2):
<real>

<integer>

<fraction>

<sign>

<digit-sequence>

<digit-sequence>

PROBLEMA!

<digit>

Mismo string Dos derivaciones


num + num * num
<expr> <expr> <op> <expr> <expr> <op> <expr> <expr> <expr> <op> <expr> <op> <expr> * num <expr>

num

num

num

num

num

124 + (23.5 * 86) = 2145

(124 + 23.5) * 86 = 12685

Precedencia de Operadores precedencia de Operadores

Expresiones

Cuando se define la gramtica de un lenguaje de programacin es necesario tomar en consideracin especial la gramtica de las expresiones. Una expresin consiste de operadores aplicados a operando para obtener un resultado. Dependiendo de la cantidad de operandos, un operador puede clasificarse como unitario o binario.

Notaciones para Expresiones La mayora de los lenguajes de programacin utilizan la notacin infija
(infix notation) para las expresiones. En la notacin infija el operador se coloca entremedio de los operandos Ejemplo: a + b Otra notacin usada es la notacin prefija (prefix notation). En esta notacin el operador se coloca antes de los operandos. Ejemplos: (1) + a b; (2) ++ a Una ltima notacin es la notacin postfija (postfix notation). En esta notacin el operador se coloca despus de los operandos. Ejemplos: (1) a b +; (2) a ++

Notaciones para Expresiones (cont.)

Ejemplo: Escriba los equivalentes en notacin prefija y posfija para la expresin infija a + b * c: Prefija: + a * b c Posfija: a b c * + Ejemplo: Escriba los equivalentes en notacin prefija y posfija para la expresin infija (a + b) * c: Prefija: * + a b c Posfija: a b + c *

Jerarqua y Asociatividad de Operadores (cont.)


La asociatividad de operadores es usada cuando se evalan operadores en el mismo nivel de jerarqua. La asociatividad indica si los operadores de igual jerarqua se evalan de izquierda a derecha o de derecha a izquierda. Jerarqua de los operadores en C y lenguajes derivados:
Operador ++, -++, --, !, +, Asociatividad Der. A Izq. Der. A Izq. Comentarios ++, -- (posfijos) ++, -- (prefijos) ! (not) +, - (pos., neg.)

Jerarqua y Asociatividad de Operadores en C (cont.)


Operador *, /, % Asociatividad Izq. A Der. Comentarios

+, <, <=, >, >= ==, != && || ?: =, +=, -=, *=, /=

Izq. A Der.
Izq. A Der. Izq. A Der. Izq. A Der. Izq. A Der. Der. A Izq. Der. A Izq.

+, - (suma, resta)

&& (and) || (or)

Gramtica para expresiones (cont.)

Fjese que la gramtica presentada toma en consideracin la asociatividad. Por ejemplo el parse tree para a + b + c es:
<expression> + <expression> + <term>

<expression>

<term>

<factor>

<term>

<factor>

< identifier >

<factor>

< identifier >

<identifier>

Arbol de Sintaxis Abstracto (cont.)

Ejemplo: el rbol para (a + b) * c es


*

Id+id*id Realizando el rbol de izq-der


E

Realizando el rbol de der-izq


E

E E

E *

id E * E E + E id

id

id

id

id

25/08/2013

23

Mtodo Descendente LL(1)


La primera L representa el tipo de lectura de la cadena de entrada Left (de izquierda a derecha) La segunda L representa la que la derivacin Left, por la izquierda. Y el 1, es el nmero de smbolos de entrada para analizar por anticipado.

25/08/2013

24

Mtodo Descendente LL(1)


Buffer de Entrada
Cadena de entrada a analizar, finaliza con el carcter $

Pila
Smbolos gramaticales que se van utilizando

Tabla de Anlisis Sintctico


Matriz bidimensional que sirve para el anlisis

Cadena de Salida
Cadena de Salida posterior al anlisis

25/08/2013

25

LL(1)

25/08/2013

26

Pasos para el Mtodo LL(1)


Escribir adecuadamente la gramtica 2. Calcular el First y el Follow 3. Construir la tabla de Anlisis Sintctico 4. Hacer el anlisis de sintctico por medio de la pila y la tabla de anlisis
1.

25/08/2013

27

Pasos para el Mtodo LL(1)


1. Escribir adecuadamente la gramtica Para poder utilizar un analizador descendente no recursivo la gramtica debe cumplir con: No debe tener ambigedad No debe ser recursiva por la izquierda Debe estar factorizada

25/08/2013

28

Pasos para el Mtodo LL(1)


2. Calcular el First / Primero
Smbolo First/Primero First(x) = {x} Aadir al First(x)

Si X es terminal
Si X produccin Si X es No Terminal y X YZW

1. Si Y aadir el First(Z) 2. Si Z aadir el First(W) 3. Si todos generan entonces aadir

25/08/2013

29

Pasos para el Mtodo LL(1)


2. Calcular el Follow / Siguiente
Smbolo Si B es smbolo inicial Si A B M Produccin Follow/Siguiente Follow ( B) = { $} 1. Follow (B) = First (M) excepto .

2. Si el First(M) contiene entonces aadir el Follow(A) a Follow (B)

Si A B Produccin

Aadir el Follow(A) a Follow(B)

25/08/2013

30

Pasos para el Mtodo LL(1)


3. Construir la tabla de Anlisis Sintctico
Se colocan las producciones que corresponden a los datos obtenidos del clculo del first.

25/08/2013

31

Pasos para el Mtodo LL(1)


4. Hacer el anlisis de sintctico por medio de la pila y la tabla de anlisis
...

Pila

Entrada

25/08/2013

32

Ejemplo LL(1)
Partiendo de la Gramtica:
E E T T F T E + T E | F T x F T | num | ( E )

1. Es una gramtica adecuada para el anlisis LL(1)

25/08/2013

33

Ejemplo LL(1)
2. Clculo del First / Primero
Smbolo No Terminal

First

E
E T T F
25/08/2013

num, (
+, num, ( x, Num, (

E T E E + T E | T F T T x F T | F num | ( E )

34

Ejemplo LL(1)
2. Clculo del Follow / Siguiente
Smbolo No Terminal

Follow

E
E T T F
25/08/2013

$,)
$,) +, $, ) + ,$, ) x, +, $, )

E T E E + T E | T F T T x F T | F num | ( E )

35

Ejemplo LL(1)
3. Construir la tabla de Anlisis Sintctico
Smbolo No Terminal

First E

First

First E T E

num, (
num + x (
ET E

ET E

25/08/2013

36

Ejemplo LL(1)
3. Construir la tabla de Anlisis Sintctico
Smbolo No Terminal

First E

First

+,
num +
E + T E

First E + T E | x (
ET E
E E

E E

ET E

25/08/2013

37

Ejemplo LL(1)
3. Construir la tabla de Anlisis Sintctico
num E E T T F
ET E E + T E TF T T TxF T TF T T T

(
ET E

)
E

$
E

F num

F( E )

25/08/2013

38

Pasos para el Mtodo LL(1)


4. Hacer el anlisis de sintctico por medio de la pila y la tabla de anlisis
num + num x num

Pila $E Colocar $ y el smbolo inicial


25/08/2013

Entrada num + num x num $ Colocar la cadena de entrada y $


39

Pasos para el Mtodo LL(1)


4. Hacer el anlisis de sintctico por medio de la pila y la tabla de anlisis
Pila $E $ E T Entrada num + num x num $ num + num x num $

25/08/2013

Se busca el smbolo terminal y el no terminal, remplazndolo por la E produccin que le corresponda. Colocndola de izquierda a derecha

num
ET E

40

Pasos para el Mtodo LL(1)


4. Hacer el anlisis de sintctico por medio de la pila y la tabla de anlisis
Pila $E $ E T $ E T F $ E T num Entrada num + num x num $ num + num x num $ num + num x num $ num + num x num $

Cuando se llega a una coincidencia, se eliminan ambos, y se continua con el anlisis


25/08/2013 41

Pasos para el Mtodo LL(1)


4. Proceso de anlisis LL(1)
Pila $E $ E T $ E T F $ E T num $ E $ E T + $ E T F ...
25/08/2013

Entrada num + num x num $ num + num x num $ num + num x num $ num + num x num $ + num x num $ + num x num $ num x num $ ...
42

Pasos para el Mtodo LL(1)


4. Proceso de anlisis LL(1)
Pila
... $ E T F $ E T num $ E T F x $ E T F $ E T num $ E T $ E $ E $ $
25/08/2013

Entrada
Se acepta la cadena si se logra eliminar de la pila y la entrada, todos los smbolos. De lo contrario no se acepta la cadena.
... num x num $ num x num $ x num $ num $ num $ $ $ $ $ $
43

ANLISIS ASCENDENTE
Estilo general: Anlisis sintctico por desplazamiento y reduccin
Por precedencia de operadores (gramticas muy especficas) LR (generadores automticos de AS)

Se construye el rbol de AS para una cadena w a partir de

las hojas y se avanza hacia la raz


Proceso: reducir w al smbolo inicial de la gramtica Cada reduccin sustituye una subcadena (asidero o mango) que

concuerde con el lado derecho de un regla de produccin por el smbolo no terminal del lado izquierdo de esa regla

ASIDEROS O MANGOS

Un asidero de una cadena es una subcadena que

concuerda con el lado derecho de una produccin y cuya reduccin al no terminal del lado izquierdo de la regla es un paso de una derivacin por la derecha
Ejemplo

S aABe A Abc Ab Bd

abbcde aAbcde aAde aABe S

asidero posicin 2 (regla A b) asidero posicin 2 (regla A Abc) asidero posicin 3 (regla B d) asidero posicin 1 (regla S aABe)

ASIDEROS O MANGOS

La produccin situada ms a la izquierda de que

concuerda con el lado derecho de una produccin A no es un asidero si la reduccin por esa regla genera una cadena no reducible al smbolo inicial
Ejemplo

S aABe A Abc Ab Bd

aAbcd e

aunque b es la subcadena situada ms a la izquierda que concuerda con una parte derecha (regla A b) no es un asidero

a A A c d e No se puede reducir a S

ASIDEROS O MANGOS Formalmente, un asidero de una forma de frase derecha es una


regla A y una posicin de donde la cadena podra encontrarse y sustituirse por A para producir la forma de frase derecha previa en una derivacin por la derecha de EE+E EE*E E ( E ) E id

Ejemplo
Formas de Frase Derecha id1 + id2 * id3 E + id2 * id3 E + E * id3 E+E*E E+E E Asidero id1 id2 id3 E*E E+E Regla de Reduccin E id E id E id E E*E E E+E

USO DE UNA PILA EN AS POR DESPLAZAMIENTO Y REDUCCIN


Problemas de implantacin del AS por desplazamiento y reduccin
Situar la subcadena a reducir Elegir la regla adecuada en caso de que haya ms de una con esa

subcadena en la parte derecha

Posible solucin utilizar:


Una pila para manejar los smbolos gramaticales Buffer de entrada para gestionar la cadena w a analizar

FUNCIONAMIENTO DEL ANALIZADOR


Inicialmente:
En la pila el smbolo de fin de cadena ($) En el buffer la cadena a analizar seguida de la marca de fin de lnea

(w$)

Repetir hasta que se detecte un error o en la pila solo haya

el smbolo inicial (E$) y la entrada est vaca ($)


Desplazar cero o ms smbolos de la entrada a la pila hasta que en

la cima haya un asidero Reducir al lado izquierdo de la regla adecuada

OPERACIONES DEL ANALIZADOR


Desplazar: Mover el siguiente smbolo de entrada a la

cima de la pila Reducir: (En este momento el extremo derecho del asidero est en la cima de la pila) Localizar el extremo izquierdo del asidero dentro de la pila y decidir el no terminal con el que se debe sustituir el asidero. Aceptar: Anunciar el fin con xito del anlisis Error: Llamar a la rutina de recuperacin de errores

pila $ $ id1 $E $E+ $ E + id2 $E+E $E+E* $ E + E * id3 $E+E*E $E+E $E

entrada

accin

id1 + id2 * id3 $ desplazar + id2 * id3 $ reducir por E id + id2 * id3 $ desplazar id2 * id3 $ desplazar * id 3 $ reducir por E id * id 3 $ desplazar id3 $ desplazar $ reducir por E id $ reducir por E E*E $ reducir por E E+E $ aceptar

TABLA DE SIMBOLOS
Tambin se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales: - Efectuar chequeos lxicos, sintcticos y semnticos. -Generacin de cdigo. Permanece slo en tiempo de compilacin, no de ejecucin, excepto en aquellos casos en que se compila con opciones de depuracin. La tabla almacena la informacin que en cada momento se necesita sobre las variables del programa, informacin tal como: nombre, tipo, direccin de localizacin, tamao, etc.

MANEJO DE ERRORES SINTACTICOS


Los errores de sintaxis se detectan cuando el analizador sintctico espera un smbolo que no concuerda con el smbolo que est analizando. El manejador de errores es un analizador sintctico tiene como objetivos: *informar la presencia de errores de forma clara y con exactitud. *se debe de recuperar de cada error con la suficiente rapidez como para detectar errores posteriores. *no debe de retrasar de manera significativa el procesamiento de programas correctos. *Debe indicar la lnea del error y algn mensaje informativo.

Los errores sintcticos tpicos son:

1. Parntesis o corchetes omitidos, por ejemplo:


x : = y * (1 + z;

2. Operadores u operando omitidos, por ejemplo:


x : = y (1 + z );

3. Delimitadores omitidos, por ejemplo:

x : = y + 1 IF a THEN y : = z.

RECUPERACION DE ERRORES. Estrategias de recuperacin de errores: Modo Pnico Nivel de Frase Producciones de error Correccin global

Recuperacin de emergencia (o en modo pnico)


Es el ms sencillo de implantar. Al detectar un error, el analizador sintctico desecha componentes lxicos hasta encontrar un carcter de sincronizacin. Estos smbolos de sincronizacin son: el punto y como. el smbolo end o cualquier palabra clave que pueda ser el inicio de una proposicin nueva. Es fcil implantar la recuperacin de emergencia, pero slo reconoce un error por proporcin.

int a.b,c; struct c { . } main() { int a; }

RECUPERACION A NIVEL DE FRASE

Esta tcnica utiliza una correccin de caracteres adyacentes, ya sea por insercin, eliminacin o intercambio. Esta tcnica permite sustituir , por ;, etc. Son traductores que corrigen errores. Desafortunadamente para muchos casos no aplican por lo que no se utilizan demasiados.

PRODUCCIONES DE ERROR
Se pueden generar gramticas para generar producciones de error y as de esta forma seguir con el proceso. La dificultad radica en el sentido de encontrar esas reglas gramaticales para generar error. En algunos casos sera inclusiva ms extensa que la gramtica del propio lenguaje. for(i<3, a<10; i++)

Vous aimerez peut-être aussi