You are on page 1of 27

Plan

BNF y EBNF Brevemente, lo necesario para especificar el lenguaje sobre el que vamos a trabajar. JLEX y JC ! Breve "escripci#n "el las $erramientas para generar el parser o anali%a"or sint&ctico. '"o (bligatorio )amos a ver la letra, el entorno "e trabajo, y un ejemplo "e entra"a y sali"a.

BNF
(BackusNaur Form)
Notaci#n formal para "efinir la sinta*is "e un lenguaje + sa"a por la mayor,a "e los lenguajes "e programaci#n ../ 0 12 34 se "efine como or repetici#n opcional + -etas,mbolos.

+ Los terminales entre comillas y negrita, por ejemplo. 5if5, 565

Ejemplo BNF
7ram&tica para representar n8meros con "ecimales numero entPos digito ::= entPos | entPos '.' entPos ::= digito | digito entPos ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

E-BNF
(Extended BNF)
9e agrega. : ; = (pcional < a n veces > a n veces

Ejemplo anterior con E-BNF


numero ::= digito + ( '.' digito + ) ?

digito ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

JLEX y J !P
JLEX
"enerador de anali#adores lexico$r%&icos para Ja'a( !sa expresiones re$ulares para reconocer los terminales del len$uaje) por ejemplo* pala+ras cla'es) identi&icadores) n,meros) strin$s) etc( -e entre$a .ec.o en el arc.i'o* Principal(ja'a

JCUP
"enerador de anali#adores sint%cticos (parsers) para Ja'a( /anual de J !P ('ers0n 1(21j)

Terminales JLE X Gramtica archivo: Sintactico.si n JCU P Principal.jav a java c Principal.class parser.java sym.java otros !.class

"rchivo #e entra#a

Tira *o c)#i+o ,%ente- #el len+%aje #e,ini#o en la letra #el o.li+atorio.

Principal.class otros !.class java

"rchivo #e sali#a

Si reconoce$ #ev%elve & error$ e imprime las estr%ct%ras reconoci#as. Sino$ imprime: 'Error sintactico( #on#e se tranc).

-cripts ,tiles
seteos.bat
configura el !?@A y el CL?99!?@A, $ay que personali%arlo para ca"a !C, y ejecutarlo antes "e los otros scripts

generarBparser.bat compilar.bat ejecutar.bat

genera los arc$ivos sym.java y parser.java "es"e 9intactico.sin

compila los .java anteriores y el !rincipal.java que se proporciona

ejecuta to"o los test

comparar.bat

compara contra la sali"a oficial to"os los test

E-BNF de ejemplo anterior*


numero := digito + ( '.' digito + ) ? digito := ' ' | '"' | '#' | '$' | '%' | '&' | ''' | '(' | ')' | '*'

import java_cup.runtime.*; import java.io.*; terminal non terminal D ! D"! D#! D$! D%;D&! D'! D(! D)! D*! P+,-.; numero! enteroPos! digito;

/* grmtica */ numero ::= enteroPos digito | | enteroPos P+,-. enteroPos;

enteroPos ::= digito

digito enteroPos;

::= D | D" | D# | D$ | D% | D& | D' | D( | D) | D*;

"ram%tica para J !P correspondiente

3especto a la salida impresa) tener presente 4ue*


+ JC ! es un L?LC DLooEB?$ea" Left to Cig$tF parser, que $ace reconocimiento bottomBup.

+ Es "ecir reconoce "e i%quier"a a "erec$a, primero las $ojas y luego el no"o pa"re.

5+li$atorio
El tra+ajo consiste en escri+ir la $ram%tica para J !P 4ue $enere el anali#ador sint%ctico (parser)( 6 este recono#ca pro$ramas (o c0di$o &uentes) del len$uaje especi&icado en la E-BNF presentada en la letra del o+li$atorio( 7dem%s de+e imprimir determinados textos a medida 4ue se 'an reconociendo ciertas estructuras(

5+li$atorio
El lenguaje presenta"o en la letra es pareci"o a C, pero mo"ifica"o y m&s sencillo. Ca"a tira Do c#"igo fuenteF "el lenguaje, es una secuencia "e "eclaraciones "e variables y funciones. G a su ve% Ca"a funci#n tiene un bloque con "eclaraciones "e variables locales Dal bloqueF, y una secuencia "e sentencias.

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%-

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%-

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& .+$/()($0%& .+ 4()0(5/+

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%-

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%0&4%$($0%&

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%0&4%$($0%& 0&4%$($0%&

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%0&4%$($0%& 0&4%$($0%& 0&4%$($0%&

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%0&4%$($0%& 0&4%$($0%& 0&4%$($0%& .+$/()($0%& .+ 12&$0%& 333

int cuadrado(int l) return l*l !" int lado" main() read(lado)" #rite(cuadrado(lado)) !

Ejemplo #e entra#a y sali#a


$%& '()(*+,)%)+,%)&( .(,%.+$/()($0%& .+ 12&$0%& 333 .+$/()($0%& .+ 4()0(5/+ 333 -0& '()(*+,)%0&4%$($0%& 0&4%$($0%& 0&4%$($0%& .+$/()($0%& .+ 12&$0%& 333 ')%6)(*(

Los mensajes 4ue se imprimen (2)


8')%6)(*(8) lue$o de reconocer el pro$rama entero( 8.+$/()($0%& .+ 4()0(5/+7n3338) lue$o de reconocer la declaraci0n de una 'aria+le 9$lo+al: (no dentro de una &unci0n)( Nota* el ;n representa un salto de l<nea) y lue$o son tres $uiones( 9.+$/()($0%& .+ 4()0(5/+ /%$(/:) lue$o de reconocer la declaraci0n de una 'aria+le local (dentro del +lo4ue de una &unci0n)(

Los mensajes 4ue se imprimen (=)


8.+$/()($0%& .+ 12&$0%&7n3338) lue$o de reconocer la declaraci0n de una &unci0n( Nota* el ;n representa un salto de l<nea) y lue$o son tres $uiones( 8$%& '()(*+,)%-8) lue$o de detectar en la declaraci0n de una &unci0n 4ue la misma tiene al menos un par%metro de entrada( 8-0& '()(*+,)%-:) lue$o de detectar en la declaraci0n de una &unci0n 4ue la misma no tiene par%metros de entrada(

Los mensajes 4ue se imprimen (A)


8(-06&($0%&8 9-+/+$$0%& -0: 9-+/+$$0%& -0 -0&%: 90,+)($0%&: 90&4%$($0%&: (>) 9)+,%)&( 4($0%: 9)+,%)&( .(,%-: lue$o de reconocer la sentencia correspondiente( (>) ?am+i@n se de+e imprimir 90&4%$($0%&: lue$o de reconocer una in'ocaci0n dentro de una expresi0n(

You might also like