Está en la página 1de 29

Especificaciones de Gramticas,

Anlisis Sintctico
y Notacin BNF
(Forma Normal de Backs)
(En construccin)
Notas Materia LENGUAJES DE PROGRAMACION
Mara de Guadalupe Cota Ortiz

Gramtica Libre de Contexto

<S> ::= ( <S> ) <S>


<S> ::= a

Gramtica Libre de Contexto

<S> ::= ( <S> ) <S>


<S> ::= a

Terminales

Gramtica Libre de Contexto

<S> ::= ( <S> ) <S>


<S> ::= a
No-terminales

Gramtica Libre de Contexto

<S> ::= ( <S> ) <S>


<S> ::= a
Smbolo inicial: <S>

Gramtica Libre de Contexto

<S> ::= ( <S> ) <S>


<S> ::= a

Regla o Produccin

Gramtica Libre de Contexto

<expr>
<expr>
<expr>
<expr>
<op>
<op>
<num>
<dig>

::=
::=
::=
::=
::=
::=
::=
::=

<expr> <op> <expr>


( <expr> ) | <expr>
- <expr>
<num>
+
Terminales:
(,),-,+,*,0,1,2,3,4,5,6,7,8,9
*
<dig> | <num>
0 | 1| 2| 3| 4| 5| 6| 7| 8| 9

Gramtica Libre de Contexto

<expr>
<expr>
<expr>
<expr>
<op>
<op>
<num>
<dig>

::=
::=
::=
::=
::=
::=
::=
::=

<expr> <op> <expr>


( <expr> ) | <expr>
- <expr>
<num>
+
No Terminales:
expr, op, num, dig
*
<dig> | <num>
0 | 1| 2| 3| 4| 5| 6| 7| 8| 9

Gramtica Libre de Contexto

<expr>
<expr>
<expr>
<expr>
<op>
<op>
<num>
<dig>

::=
::=
::=
::=
::=
::=
::=
::=

<expr> <op> <expr>


( <expr> ) | <expr>
- <expr>
<num>
+
Smbolo inicial:
expr
*
<dig> | <num>
0 | 1| 2| 3| 4| 5| 6| 7| 8| 9

Gramtica Libre de Contexto

<expr>
<expr>
<expr>
<expr>
<op>
<op>
<num>
<dig>

::=
::=
::=
::=
::=
::=
::=
::=

<expr> <op> <expr>


( <expr> ) | <expr>
- <expr>
<num>
Producciones
+
*
<dig> | <num>
0 | 1| 2| 3| 4| 5| 6| 7| 8| 9

Recordatorio
(Recorridos)

Recorrido Pre-Orden (Derivacin izquierda)


INICIO

FIN
1

2
3

6
4

7
5

Recorrido:

1,2,3,4,5,6,7,8,9

Recordatorio
(Recorridos)

Recorrido POS-Orden-Inverso (Derivacin


derecha)
INICIO

FIN
1
2
3

6
4

7
5

Recorrido:

1,6,7,9,8,2,4,5,3

Arbol de Parseo
Derivacin por la izquierda

<expr> ::= <num>


Cadena: 1 * ( 3 + 5 )
<expr>
<expr>

<num>
<dig>

<op>

<expr>
<expr>

<expr> <op>
<num>

)
<expr>
<num>

<dig>

<dig>

Arbol de Parseo
Derivacin por la derecha

Produccin: <expr> num


Cadena: 1 * ( 3 + 5 )
<expr>
<expr>

<op>

<num>

<dig>
1

<expr>
<expr>

<expr> <op>
<num>

)
<expr>
<num>

<dig>

<dig>

Parser Top-down (LL)

<expr>
<expr> <op> <expr>
<num> <op> <expr>
<dig> <op> <expr>
1 <op> <expr>
1 * <expr>
1 * ( <expr> )
1 * ( <expr> <op> <expr> )
1 * ( <num> <op> <expr> )
1 * ( <dig> <op> <expr> )
1 * ( 3 <op> <expr> )
1 * ( 3 + <expr> )
1 * ( 3 + <num> )
1 * ( 3 + <dig> )
1 * ( 3 + <5> )

Parser Bottom-Up (LR)

<expr>
<expr> <op> <expr>
<expr> <op> ( <expr> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> <op> <num> )
<expr> <op> ( <expr> <op> <dig> )
<expr> <op> ( <expr> + <dig> )
<expr> <op> ( <num> + <dig> )
<expr> <op> ( <dig> + <dig> )
<expr> * ( <dig> + <dig> )
<num> * ( <dig> + <dig> )
<dig> * ( <dig> + <dig> )

(Se invierte el orden de evaluacin)

Parser Bottom-Up (LR)

<dig> * ( <dig> + <dig> )


<num> * ( <dig> + <dig> )
<expr> * ( <dig> + <dig> )
<expr> <op> ( <dig> + <dig> )
<expr> <op> ( <num> + <dig> )
<expr> <op> ( <expr> + <dig> )
<expr> <op> ( <expr> <op> <dig> )
<expr> <op> ( <expr> <op> <num> )
<expr> <op> ( <expr> <op> <expr> )
<expr> <op> ( <expr> )
<expr> <op> <expr>
<expr>

(Quedando de esta forma)

Ambigedad

<expr>
<expr> <op>

num

<expr>

num

<expr>
<expr>
<op>

12 + (5 * 8) = 52

<expr>
<expr>

num

<expr>

num

<op>

<op>

<expr>

<expr>
*

num

num

(12 + 5) * 8 = 136

Dos o ms derivaciones distintas para una misma expresin

Ejemplo de Arbol de Derivacin


<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})

for

<tipo> <variable> =

<valor> ;

<condicion> ; <expr_inddec>

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void

for

<tipo> <variable> =

<valor> ;

<condicion> ; <expr_inddec>

int

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z

for

<tipo> <variable> =

<valor> ;

<condicion> ; <expr_inddec>

<carcter>

int

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z

for

<tipo> <variable> =

<valor> ;

<condicion> ; <expr_inddec>

<carcter>

int

ind

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

for

<tipo> <variable> =

int

<valor> ;

<carcter>

<digito>

ind

<condicion> ; <expr_inddec>

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>

for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito><variable> <operador> <valor>

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>

for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito> <variable> <operador> <valor>

ind

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>
<operador>::= + | - | / | * | > | >= | < | <= | = | == | !

for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito><variable> <operador> <valor>

ind

<

for(int ind = 0; ind < 10; ind++)

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>
<operador>::= + | - | / | * | > | >= | < | <= | = | == | !

for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito><variable> <operador> <valor>

ind

<

for(int ind = 0; ind < 10; ind++)

10

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>
<operador>::= + | - | / | * | > | >= | < | <= | = | == | !
<expr_inddec>::= <variable> ++ | - - for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito><variable> <operador> <valor> <variable>

ind

for(int ind = 0; ind < 10; ind++)

<

10

Ind

Ejemplo
<for>::= ([, {<tipo> <variable> = <valor>}];[,{ <condicion>}]; [,{<expr_incdec>})
<tipo>::= int | char | float | double | long | short | void
<variable>::= {<carcter>}+
<caracter>::= a | b |.... | z | A |.... | Z
<valor>::= {<digito>} +
<digito>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<condicion>::= <variable><operador><valor>
<operador>::= + | - | / | * | > | >= | < | <= | = | == | !
<expr_inddec>::= <variable> ++ | - - for

<tipo> <variable> =

<carcter>

int

ind

<valor> ;

<condicion> ; <expr_inddec>

<digito><variable> <operador> <valor> <variable> ++

ind

for(int ind = 0; ind < 10; ind++)

<

10

Ind

!!! Cadena aceptada !!!

También podría gustarte