Está en la página 1de 22

Gua de Instalacin y Ejemplos

USAC
Facultad de Ingeniera
Manuel Elias Muhn Esuit
!"""#$%$"
&le' es una herramienta desarrollada en &a(a el cual puede reci)ir un
archi(o de entrada *archi(o +le', dentro del cual se declaran
e'presiones regulares y to-ens (.lidos para un lenguaje ue
deseamos reconocer+ /icho de otro modo &le' es una herramienta
para generar anali0adores l1'icos+
CU2 es un generador de parsers para gram.ticas tipo 3A34*#,5
dentro del cdigo del archi(o de entrada *archi(o +cup, de)en e'istir
declaraciones de producciones y asociacin de 6ragmentos de cdigo
&a(a+ Cuando una produccin es reconocida5 se genera un archi(o
6uente &a(a5 parser+ja(a ue contiene una clase parser5 con un
m1todo Sym)ol parser*,5 el cual es utili0ado para anali0ar un archi(o
de entrada ue contiene instrucciones (alidas para el lenguaje ue
hemos creado con &le' 7 CU2+
3as e'tensiones de archi(os de entrada pueden ser de cualuier tipo5
al 6inal y al ca)o son archi(os planos+
#+ Instalacin del &/8 de &a(a *entorno necesario para compilar y ejecutar clases ja(a, y modi6icacin del C3ASS2A9:
!+ /escarga e instalacin de &le'
;+ /escarga e instalacin de CU2
%+ Ejemplo
<+ Funcionamiento
2ara poder utili0ar &le' 7 CU2 uno de los primeros pasos
reueridos es la instalacin del &/85 el cual es el entorno
necesario para compilar y ejecutar clases &a(a+
El instalador del &/8 se puede descargar desde la p.gina
de SU= *http>??ja(a+sun+com?j!se?#+%+!?do@nload+html,+
El procedimiento para instalar el &/8 en el entorno Aindo@s
es el tradicional do)le clic so)re el archi(o ejecuta)le y
luego el )otn siguiente hasta llegar al 6inal de la instalacin+
2ara este ejemplo nos hemos descargado el jd-#+B+"5 sin
reali0ar modi6icaciones a la carpeta de instalacin ue
aparece por de6ault aunue es posi)le instalarla en cualuier
u)icacin de nuestro disco duro+
Clic derecho so)re My
Computer *Mi 2C,5 escoger
2roperties *2ropiedades, y
luego en System 2roperties
*2ropiedades del Sistema,
se de)e escoger la pestaCa
Ad(anced+
2resionare el )otn
En(ironment Darial)es
*Daria)les de Entorno,
=os posicionamos so)re la
(aria)le de entorno
C3ASS2A9:5 y
presionamos el )otn Edit
*Editar,+
Si la (aria)le de entorno no
e'iste5 entonces de)e ser
creada presionando el
)otn =e@ *=ue(o, y
agregar los datos
correspondientes+
=os u)icamos al 6inal de la cadena dentro de Daria)le Dalue
*Dalor de la Daria)le, y agregamos punto y coma5 seguido del
2ath de u)icacin de la carpeta )in de la instalacin del &/85 en
ejemplo se agrega la cadena> EFC>G2rogram
FilesG&a(aGjd-#+B+"G)inH sin las comillas+
2resionamos el )otn I- y agregamos la misma cadena a la
(aria)le 2ath+
4eali0amos los pasos anteriores
para agregar la cadena EFC>G2rogram
FilesG&a(aGjd-#+B+"G)inH a la (aria)le
2ath+ Si la (aria)le 2ath no e'iste
de)e ser creada utili0ando el )otn
=e@ *=ue(o, e ingresar los datos+
/espu1s de las anteriores
modi6icaciones al C3ASS2A9: y al
2ath ya podemos utili0ar los
comandos de &a(a *ja(a5 ja(ac5
applet(ie@er5 jar5 etc+, desde
cualuier carpeta dentro de nuestro
disco duro+
&le' es una herramienta creada en y para el lenguaje &a(a ue
sir(e para crear anali0adores l1'icos5 a continuacin
descri)imos los pasos de su instalacin>
#+/escargar el archi(o de instalacin de &le' *
http>??@@@+cs+princeton+edu?Jappel?modern?ja(a?&3e'?,5 el cual
consiste en un archi(o ja(a *Main+ja(a,+
!+U)icar el Main.java en cualuier carpeta de nuestro disco
duro5 en este caso creamos la carpeta jle' dentro del )in del
&/8> C>G2rogram FilesG&a(aGjd-#+B+"G)inGjle'+
;+A)rimos una (entana del /+I+S+ dentro de la carpeta jle' y
compilamos el Main.java con la instruccin> ja(ac Main+ja(a5
despu1s de lo cual podemos (er los archi(os +class creados
dentro de la carpeta jle'+
C>G2rogram FilesG&a(aGjd-#+B+"G)inGjle'Kja(ac Main+ja(a
Como se hiso mencin en la intro CU2 es un generador de
parsers5 a continuacin descri)imos los paso para su
instalacin+
#+/escargar el archi(o de instalacin de CU2 *
http>??@@@+cs+princeton+edu?Jappel?modern?ja(a?CU2?,5 el cual
consiste en un archi(o +0ip+
!+/escomprimimos el archi(o y podemos (er (arios archi(os y
carpetas+ 3a carpeta ue no interesa es ja(aLcup la cual
podemos u)icar en cualuier lugar de nuestro disco duro5 en
este caso lo u)icamos en la carpeta )in de instalacin del &/8
similar a como lo hicimos con el Main+ja(a de &le'+
;+En este caso no es necesario compilar el contenido de la
carpeta ya ue estos archi(os han sido pre(iamente
compilados5 podemos notarlo por las clases ue se encuentran
dentro de la carpeta+
Ejemplo del Archi(o &3e'>
Guardamos el archi(o con el nom)re le'ico+le' en cualuier
carpeta de nuestro disco duro5 en este caso en> C>Gprue)a+
/*Definicin del paquete al que pertenece y otros paquetes que puede utilizar
*/
package Ejemplo;
import java_cup.runtime.ym!ol;
/*D"#E$%"&' ('#' E) '#$*"&+ )E,
(ara que sea compati!le con cup
-cup
*ace la clase pu!lica
-pu!lic
'grega todos los caracteres. para que este disponi!le la /
-full
(ara utilizar el atri!uto line
-line
(ara utilizar el atri!uto c0ar
-c0ar
$oloca el case insensitive. es decir no 0ace diferencia entre mayusculas y minusculas
-ignorecase
Esto genera el sim!olo de final de arc0ivo
-eofval
*/
/*los nom!re que aparecen despues de sym. son los nom!re que se le dan a los %E#1"2')E.
despues se de!e de especificar el tipo que se devolvera. regularmente tring. pero puede
ser cualquier otro tipo y despues convertirlo*/
/*2ota3
4le5 no acepta comentarios de!ajo de este s6m!olo de do!le porcentaje.
*/
--
-7
//declaracin de varia!les y cdigo que va 0a ser copiado al escaner
pu!lic static int linea89;
pu!lic static int pos8:;
/*2ota3
En este !loque se pueden escri!ir comentarios.
*/
-;
-cup
-full
-line
-c0ar
-ignorecase
-eofval7
return ne< ym!ol=sym.E+>.ne< tring=?>in de 'rc0ivo?@@;
-eofval;
--
?;? 7/*aqui puede ir cualqier otro cdigo3 algAn calculo o asignacin*/
return ne< ym!ol=sym.E1". ne< tring=yyte5t=@@@;;
?B? 7return ne< ym!ol=sym.()C.ne< tring=yyte5t=@@@;;
?D? 7return ne< ym!ol=sym.1"2C.ne< tring=yyte5t=@@@;;
?/? 7return ne< ym!ol=sym.D"&".ne< tring=yyte5t=@@@;;
?*? 7return ne< ym!ol=sym.%"1E.ne< tring=yyte5t=@@@;;
?=? 7return ne< ym!ol=sym.)('#E2.ne< tring=yyte5t=@@@;;
?@? 7return ne< ym!ol=sym.#('#E2.ne< tring=yyte5t=@@@;;
E:DFGB 7return ne< ym!ol=sym.2C1HE#. ne< "nteger=yyte5t=@@@;;
E ItIrInIfG 7/* "gnora espacios en !lanco. ta!uladores. retornos de carro. etc.*/;
?.? 7return ne< ym!ol=sym.(C2%+@;
/*al estar encerrado entre comillas devuelve el token (C2%+ cuando lea
un punto de la entrada. 2otese la diferencia con la siguiente instruccion
donde el punto aparece sin comillas. $uando se coloca un punto sin comillas
junto a sus acciones estas acciones serJn ejecutadas cada vez que el analizador
le5ico encuentre algun le5ema que no concuerde con cualquiera de los
componentes le5icos especificados. (or ejemplo. al encontrar un sim!olo
como la K estre imprimira en la s0ell ?$aracter "legal3 K?. la funcin
yyte5t=@ devuelve el ultimo le5ema levantado por el analizador le5ico.*/
;
. 7ystem.out.println=?$aracter "legal3 ?Byyte5t=@@;;
El cdigo esta comentado para un mejor entendimiento de cada parte o
)loue ue lo compone+
A)rimos una (entana de /+I+S+ en la carpeta C>Gprue)a y
ejecutamos la instruccin>
ja(a &3e'+Main le'ico+le'
Ejemplo del Archi(o CU2>
Guardamos el archi(o con el nom)re sintactico+cup en la misma
carpeta donde guardamos el archi(o le'> C>Gprue)a+
/*'qui se incluye el nom!re del paquete al que va a pertenecer la clase parser.java
y todos los paquetes que se vayan a utilizar dentro del proyecto. (or ejemplo si se
fuera a utilizar la clase 'rray)ist se de!e agregar la linea import 4ava.util.'rray)ist;
*/
package Ejemplo;
import java.io.*;
import java_cup.runtime.*; //$lase que incluye las instrucciones de $C(
/*el !loque que siguie es codigo que se copia a la clase parser.java.
que puede ser utilizado dentro de las acciones semJnticas
este cdigo se copia e5actamente igual sin revisar errores.
*/
parser code
73
pu!lic static void main=tring argsEG@ t0ro<s E5ception7
//ne< parser=ne< Lyle5=ne< >ile"nputtream=argsE:G@@@.parse=@;
ne< parser=ne< Lyle5=ystem.in@@.parse=@;
;
//este mMtodo sirve para el manejo de errores provisto por $C(
pu!lic void synta5_error=ym!ol s@7
report_error=?Error de sinta5is )inea3?B"nteger.totring=Lyle5.lineaB9@B?
$olumna3?B"nteger.totring=Lyle5.posB9@B? En I??Bs.valueB?I??.null@;
;
3;
//eccin donde se pueden declarar varia!les. constantes. etc
action code
73 //mis varia!les
int integer 8 9;
3;
/* Declaracin de terminales y los tipos que pueden declararse */
//declaracin de terminales y sus tipos
terminal tring E1". ()C. 1"2C. D"&". %"1E. )('#E2. #('#E2;
terminal "nteger 2C1HE#;
terminal (C2%+;
//Declaracion de no terminales y sus tipos
non terminal e5pr_list. e5pr_part;
non terminal "nteger e5pr;
//presedencia de operadores
precedence left ()C. 1"2C;
precedence left %"1E. D"&";
/*
NramJtica3 el lado izquierdo es reemplazado por su correspondiente produccin
si es un no terminal. las acciones semJnticas se colocan entre llaves y dos puntos 733;
Cn terminal o no terminal seguido de dos puntos y una letra sirve como un alias del terminal
o no terminal para poder utilizarlo como una varia!le del tipo que le fue asignado en los !louqes
anteriores.
*/
e5pr_list 338 e5pr_list e5pr_part
Oe5pr_part
;
e5pr_part 338 e5pr3e E1" 73 ystem.out.println=?+peracion E5itosa. #esulatado8?Be.int&alue=@@; 3;
O(C2%+ 73 ystem.out.println=?'rc0ivo (arseado E5itosamente.?@; 3;
;
e5pr 338 2C1HE#3n 73 #EC)%8n; 3;
Oe5pr3l ()C e5pr3r 73 #EC)%8ne< "nteger=l.int&alue=@ B r.int&alue=@@; 3;
Oe5pr3l 1"2C e5pr3r 73 #EC)%8ne< "nteger=l.int&alue=@ D r.int&alue=@@; 3;
Oe5pr3l D"&" e5pr3r 73 if =r.int&alue=@ P8 :@ 7
#EC)%8ne< "nteger=l.int&alue=@ / r.int&alue=@@;
;
else7
ystem.out.println=?Error emantico Divisin por $ero.?@;
;
3;
Oe5pr3l %"1E e5pr3r 73 #EC)%8ne< "nteger=l.int&alue=@ * r.int&alue=@@; 3;
O)('#E2 e5pr3e #('#E2 73 #EC)%8e; 3;
Oerror E1" 73ystem.out.println=?Error de inta5is?@;3;
;
Al igual ue el archi(o le'5 el archi(o cup esta comentado para una
mejor comprensin+
A)rimos una (entana de /+I+S+ en la carpeta C>Gprue)a y
ejecutamos la instruccin>
ja(a ja(aLcup+Main sintactico+cup
2ara unir los archi(os generados por el &le' 7 CU2 y o)tener
el anali0ador 6inal ejecutamos la instruccin>
ja(ac Md + parser+ja(a sym+ja(a to-!+le'+ja(a
El anali0ador ue aca)amos de crear reconoce e'presiones
aritm1ticas ).sicas> suma5 resta5 multiplicacin y di(isin+ 3os
datos de entrada pueden escri)irse en un archi(o >
&a(a Ejemplo+parser N entrada+t't
<O;PBF
<O;M%F
*<O#",P!F
$?!M#"F
9am)i1n podemos ingresar e'presiones desde consola>
ja(a Ejemplo+parser
E ingresando>
<P<M#"O!P<F #?#M#F
#"O;M<F #"?<O#;M;F

También podría gustarte