Professional Documents
Culture Documents
ELABORADO POR:
Francisco de jesus sayas cosme Gilberto Xolot Pio Marcos Hernndez Martnez Gustavo de Jesus Gonzlez Nava
FECHA DE ENTREGA:
30 de septiembre de 2013
OBJETIVO:
JFLEX es una herramienta JAVA que permite actuar sobre aquellas cadenas de un fichero de texto que encajan en una expresin regular. El formato de un programa en jflex es similar al ejemplo siguiente:
Zona de cdigo de usuario: Reservada para incluir las instrucciones import /* Cdigo incluido fuera de la clase a generar */ %% Zona de opciones y declaraciones: Las opciones comienzan con un % al inicio de lnea %class Lexer/* Se generara un fichero Lexer.java que incluir la clase Lexer*/ %standalone /* La clase Diego incluir la funcin main Esta funcin recibir como argumento el fichero de texto a analizar */ %% Zona de reglas lxicas: Incluyen las expresiones junto con sus acciones /* Cambia en un texto digo por Diego */ "digo" { System.out.print("Diego"); } Para ejecutar se necesita realizar los siguientes pasos:
Pgina 1
Pgina 2
METODOLOGIA Y DESARROLLO 1. Teclear el ejemplo anterior en el bloc de notas y guardarlo como diego.flex. Checar que no se guarde con el formato del bloc de notas (txt) al guardar poner todos los archivos y teclear el nombre con la extensin. Guardar el en el bin del jflex 2. Compilar en lnea mediante la instruccin en la carpeta del //jflex//bin jflez diego.flex 3. Se generara un archivo llamado Lexer.java si se compila correctamente 4. Abrir el archivo generado en java y compilar en java 5. Crear un archivo de entrada como nombre entrada.txt que tenga lo siguiente: Donde dije digo, digo Diego 6.- Al compilar en java generara el ejecutable .class 7.- Ejecutar el java lexer entrada.txt 8.- La salida debe corresponder con la siguiente instruccin: Donde dije Diego,Diego Diego
CUESTIONARIO
a) (BinarioPar)Escriba un analizador lxico que sustituya las apariciones de un nmero par escrito en notacin binaria por la cadena "BINARIO_PAR. Se tiene que crear un archivo de entrada que
Pgina 3
contenga solo nmeros binarios y la salida tiene que imprimir en pantalla si es numero par o impar. Ejemplo de entrada: 1000 10001 1000111 Salida: PAR IMPAR IMPAR b) (Ca_sa)Escriba un analizador lxico que sustituya las cadenas casa, camisa y carcasa que figuran en un texto por la cadena "CA_SA". se tiene que crear un achivo de entrada que contenga las palabras casa, camisa y carcasa, se pueden repetir tantas veces se quiera; pero cuando aparezcan estas palabras debe mandar a imprimir a pantalla Ca_sa. Por ejemplo: Casa hola carcasa camisa Salida: Ca_sa Ca_sa Ca_sa c) (Blancos)Escriba un analizador lxico que reduzca a un nico espacio en blanco todas las secuencias de espacios en blanco y tabuladores de un texto. debe leer un archivo de secuencias de palabras con espacios y tabuladores y como salida si entre palabra y palabra hay ms de un espacio debe reducir la salida a un solo espacio. Ejemplo: Entrada: Eneida Yazmin Honorato Salida: Eneida Yazmin Honorato
d) (ComentarioLinea)Escriba un analizador lxico que suprima los comentarios de lnea de un texto (desde un # hasta el fin de la lnea). Ejemplo de entrada: Este es un ejemplo #este es un comentario Casa #ejemplo Otro #ejemplo Salida: Este es un ejemplo Casa RESULTADOS Practica 1: %% %class ejemfle %standalone num=[0-9]+ palabra=[A-Z|a-z]+ %%
Pgina 4
Pgina 5
a)Binario_par %% %class impar %standalone par=[1|0]+0 impar=[1|0]+1 %% {par} {System.out.println("es un binario par");} {impar} {System.out.println("es un binario impar");}
Pgina 6
Pgina 7
Pgina 8
Pgina 9
Pgina 10
Pgina 11
Se espera que el alumno aprenda a compilar los archivos en jflex y permita realizar depuraciones tanto en jflex como en java. As como la realizacin de diferentes analizadores lxicos que permitan tener una nocin para iniciar la fase lxica de su proyecto.
BIBLIOGRAFIA Compiladores. Alfred V. Aho Editorial. Limusa Java a tope. Compiladores. Traductores y compiladores con Lex, Yacc, Jflex,cup y javacc. Sergio Glvez Rojas. Miguel ngel Mora Mata. Versin Electrnica, DEPSITO LEGAL: MA-1852005
Pgina 12
OBJETIVO:
El alumno aprender el uso de mtodos establecidos en jflex para la deteccin de patrones (lexemas) y la utilizacin de patrones en conjunto para simplificar cdigo. FUNDAMENTO TEORICO
String yytext() devuelve la cadena que encaj en el patrn char yycharat(int i) devuelve el i simo carcter de la cadena que encaj int yylength() devuelve la longitud de la cadena que encaj/* El patrn conjunto (operador []) representa un carcter de los incluidos entre los corchetes (se admiten rangos de caracteres usando el smbolo guin). Si el primer carcter del conjunto es el ngulo, entonces el patrn representa cualquier carcter no incluido en el conjunto [aeiou] representa una de las vocales [^A-Za-z0-9] representa un carcter no alfanumrico MATERIAL/EQUIPO Computadora Java Jflex Manual de Practicas de la materia METODOLOGIA Y DESARROLLO
Pgina 13
/* Imprime el ultimo bit de cada nmero binario */ %% %class UltimoBit %standalone % (0|1)+ { int ultimo=yylength()-1; System.out.print("[Binario "+yytext());System.out.print(" Ultimo Bit: "+yycharat(ultimo)+"]");} 2.- Compilar siguiendo el mismo procedimiento de las practica anterior 3.- El archivo de entrada tendr nmeros binarios 4.- Verificar la salida. 5.-Compilar siguiendo el mismo procedimiento utilizado en la prctica anterior. 6.- Verificar el funcionamiento de los mtodos yylength y yycharat asi como el formato Realizar los siguientes analizadores lxicos (Asteriscos)Escriba un analizador lxico que inserte un * delante y detrs de cada carcter + que figura en un texto (Puntos)Escriba un analizador lxico que enmarca entre corchetes el carcter que precede a cada uno de los puntos que figuran en un texto. (DiaSemana)Escriba un analizador lxico que sustituya las apariciones de un nmero de la semana (de 1 a 7) por su correspondiente nombre de da.
(Operador)Escriba un analizador lxico que sustituya los operadores de suma +, resta -, producto * y divisin / y potencia ^ por la cadena "OPERADOR. (Hexadecimal)Escriba un analizador lxico que sustituya las apariciones de un nmero escrito en base hexadecimal por la cadena "HEXADECIMAL". (A_Mayusculas)Escriba en maysculas todas las palabras de un texto que comienzan por maysculas. (Considere que una palabra es una secuencia constituida por letras minsculas o maysculas). (Cadenas)Escriba un analizador lxico que sustituya todas las cadenas de un texto por el contenido de la cadena sin las comillas (Por ejemplo: "hola" sera sustituido por hola). Se define como cadena cualquier texto enmarcado entre comillas dobles con la condicin de que en su contenido no figuran ni comillas dobles ni saltos de lnea.
RESULTADOS
Pgina 14
a) UltimoBit
/* Imprime el ultimo bit de cada nmero binario */ %% %class UltimoBit %standalone %% (0|1)+
{int ultimo=yylength()-1; System.out.println("El numero Binario: "+yytext()); System.out.println("El Ultimo Bit es: "+yycharat(ultimo));}
Pgina 15
Pgina 16
Pgina 17
Pgina 18
d) DiaSemana /* Imprime el ultimo bit de cada nmero binario */ %% %class DS %standalone %% "1" {System.out.println("Domingo");} "2" {System.out.println("Lunes");} "3" {System.out.println("Martes");} "4" {System.out.println("Miercoles");} "5" {System.out.println("Jueves");} "6" {System.out.println("Viernes");} "7" {System.out.println("sabado");}
Pgina 19
Pgina 20
Pgina 21
f) A_Mayusculas /*(A_Mayusculas)Escriba en maysculas todas las palabras de Un texto que comienzan por maysculas. (Considere que una palabra es una secuencia constituida por letras minsculas o maysculas).*/ %% %class Mayus %standalone BLANCO=[ |\r|\n|\t|\f] Palabra = [a-zA-Z]+ Mayuscula= [A-Z]+ PalMay={Mayuscula}{Palabra} %% {BLANCO}+ {;} {PalMay} {System.out.println("MAYUSCULA");}
Pgina 22
Pgina 23
Pgina 24
Los resultados que se esperan es que en cada archivo generen salidas que el analizador indica
CUESTIONARIO
NOTAS Y SUGERENCIAS Por esta descuidado tuve un error de dedo, por lo tanto prosegu a corregir para este se ejectara correctamente
Pgina 25
Java a tope. Compiladores. Traductores y compiladores con Lex, Yacc, Jflex,cup y javacc. Sergio Glvez Rojas. Miguel ngel Mora Mata. Versin Electrnica, DEPSITO LEGAL: MA-1852005
Pgina 26
PRCTICA NO. 3
OBJETIVO:
FUNDAMENTO TEORICO Una macro asocia un identificador a una expreg. Su utilidad es doble, por un lado se favorece la reutilizacin, y por otra se aumenta la legibilidad del analizador lxico Las macros son declaraciones no recursivas que se incluyen en la zona de declaraciones y opciones. Digito = [0-9] Para expandir la macro se encierre el nombre de la macro entre llaves. {Digito} TECLEA EL SIGUIENTE EJEMPLO: /* Identifica enteros y palabras de un texto*/ %% %class Lexer %standalone Blanco = [\r\n \t\f] Entero = ("+"|"-")?[0-9]+ Palabra = [a-zA-Z]+ %% {Blanco}+ {} {Entero} {System.out.print("INT: "+yytext()+"\n");} {Palabra} {System.out.print("WORD: "+yytext()+"\n");} . {System.out.print("OTHER: "+yytext()+"\n");} Compilar y probar la identificacin de nmeros y palabras Teclear el siguiente ejemplo: /* Muestra los identificadores de un texto */ %% %class Lexer %standalone Digito = [0-9]
Pgina 27
Compilar y verificar la manera en que detectan los identificadores de un archivo de texto. MATERIAL/EQUIPO Computadora Java Jflex Manual de Practicas de la materia METODOLOGIA Y DESARROLLO
Probar los ejemplos anteriores utilizando la metodologa de compilacin de las anteriores practicas
/* Identifica enteros y palabras de un texto*/ %% %class macro %standalone BLANCO=[ |\r|\n|\t|\f] ENTERO = ("+"|"-")?[0-9]+ PALABRA = [a-zA-Z]+ %% {BLANCO}+ {;} {ENTERO} {System.out.print("INT: "+yytext()+"\n");} {PALABRA} {System.out.print("WORD: "+yytext()+"\n");} . {System.out.print("OTHER: "+yytext()+"\n");} PROGRAMACION DE SISTEMAS [Escriba texto] Pgina 28
Pgina 29
a) Real /*Escriba un analizador lxico que sustituya las apariciones de nmero reales en notacin cientfica por la cadena "REAL". Se admiten como cadenas (lexemas): -3.4 .4 3.E10 .6e2 No se admiten las siguientes: 45 4.6E */ %% %class numreales %standalone BLANCO=[ |\r|\n|\t|\f] Numero = ("-")?[0-9]+([0.0-0.9])* Exponencial = ["e|E"]+(("-")?[0-9])+ REAL={Numero}{Exponencial}* %% {BLANCO}+ {;} {REAL} {System.out.println("Numero Real");}
Pgina 30
b) Horas /*(Horas.flex)Escriba un analizador lxico que sustituya las expresiones horarias que encajan o bien con el patrn HH:MM o bien con el patrn H:MM por la cadena "HORA". Tenga en cuenta que las horas deben ser correctas. Por ejemplo: 29:80 no sera una hora correcta.*/ %% %class Horas %standalone BLANCO=[ |\r|\n|\t|\f] Horas = [0-23]+ Minutos = [0-60]+ Dospuntos= ":" HORA={Horas}{Dospuntos}{Minutos} %% {BLANCO}+ {;} {HORA} {System.out.println("HORA");} PROGRAMACION DE SISTEMAS [Escriba texto] Pgina 31
Pgina 32
c) May_min /*(May_Min.flex) Sustituye las palabras de un texto que empiezan por minsculas por la cadena MINUSCULA y las palabras que empiecen por maysculas por la cadena MAYUSCULA.*/ %% %class Maymin %standalone BLANCO=[ |\r|\n|\t|\f] Minuscula = [a-z]+ Palabra = [a-zA-Z]+ Mayuscula= [A-Z]+ PalMin={Minuscula}{Palabra} PalMay={Mayuscula}{Palabra} %% {BLANCO}+ {;} {PalMin} {System.out.println("MINUSCULA");} {PalMay} {System.out.println("MAYUSCULA");}
Pgina 33
d) Fechas /*(Fechas.flex)Para representar fechas existen dos formatos: el americano (AAAA/DD/MM) y el europeo (DD/MM/AAAA). Escriba un analizador lxico que imprima todas las fechas de un texto que se ajusten a uno de dichos formatos indicando adems qu formato fue usado (Ignore la problemtica relacionada con los aos bisiestos). */ %% %class Fechas %standalone BLANCO=[ |\r|\n|\t|\f] Aos = [0-9]+ Meses = [1-12] Dias = [1-31] D = ["/"]* americano = {Aos}{D}{Dias}{D}{Meses} europeo = {Dias}{D}{Meses}{D}{Aos} %% {BLANCO}+ {;} {americano} {System.out.println("formato americano: "+yytext());} {europeo} {System.out.println("formato europeo: "+ yytext());}
Pgina 34
Pgina 35
(Real.flex)Escriba un analizador lxico que sustituya las apariciones de nmero reales en notacin cientfica por la cadena "REAL". Se admiten como cadenas (lexemas): -3.4 .4 3.E10 .6e-2 No se admiten las siguientes: 45 4.6E .
(Horas.flex)Escriba un analizador lxico que sustituya las expresiones horarias que encajan o bien con el patrn HH:MM o bien con el patrn H:MM por la cadena "HORA". Tenga en cuenta que las horas deben ser correctas. Por ejemplo: 29:80 no sera una hora correcta. Utiliza el anlisis de varios patrones para realizar los siguientes analizadores:
(May_Min.flex) Sustituye las palabras de un texto que empiezan por minsculas por la cadena
MINUSCULA y las palabras que empiecen por maysculas por la cadena MAYUSCULA.
BIBLIOGRAFIA Compiladores. Alfred V. Aho Editorial. Limusa Java a tope. Compiladores. Traductores y compiladores con Lex, Yacc, Jflex,cup y
Pgina 36
javacc. Sergio Glvez Rojas. Miguel ngel Mora Mata. Versin Electrnica, DEPSITO
LEGAL: MA-185-2005
OBJETIVO:
FUNDAMENTO TEORICO El orden de las reglas lxicas es relevante cuando los patrones son ambiguos. Dos patrones son ambiguos si existe una cadena que encaja en ambos.
Pgina 37
1.El analizador lee la entrada hasta encontrar la cadena ms larga que encaje con algn patrn. 2.En caso de empate se escoge la regla lxica escrita en primer lugar /* Patrones ambiguos */ %% %class Lexer %standalone Blanco = [\r\n \t\f] %% {Blanco}+ {} a|b {System.out.print("P1 ");} (ab)* {System.out.print("P2 ");} (a|b)* {System.out.print("P3 ");} . {System.out.print("PP ");} Cul es la salida del analizador para las entradas "a", "aaaa", "abab" y "ababb"?
OTRO EJEMPLO
/* Identifica los nmero en base 3 y 2. Prioridad a la base 3*/ %% %class Lexer %standalone Blanco = [\r\n \t\f] %% {Blanco}+ {;} [012]+ {System.out.print("BASE 3\n");} [01]+ {System.out.print("BASE 2\n");}
Pgina 38
/* Identifica los nmero en base 2 y 3. Prioridad a la base 2 */ %% %class Lexer %standalone Blanco = [\r\n \t\f] %% {Blanco}+ {;} [01]+ {System.out.print("BASE 2\n");} [012]+ {System.out.print("BASE 3\n");} . {}
Pgina 39
CUESTIONARIO (If_then_else.flex)Escriba un analizador lxico que sustituya cada identificador de un texto por la cadena IDENT salvo que el identificador sea una de las palabras reservadas: If, Then o Else. En este ltimo caso deber imprimirse respectivamente las cadenas IF, THEN y ELSE. Las anteriores palabras reservadas no son sensibles a la capitalizacin, es decir, podrn aparecer mezcladas arbitrariamente letras minsculas y maysculas. Por ejemplo, para la palabra reservada Else se admiten tambin las formas ELSe o eLsE.
Pgina 40
(Numeros.flex)Escriba un analizador lxico que distinga entre los siguientes tipos de nmeros: entero (INT) entero largo (LONG) y real (FLOAT). Los enteros largos son enteros terminados con una letra l mayscula o minscula. Los reales deben incluir de forma obligatoria parte entera y parte decimal separadas por un punto.
Pgina 41
NOTAS Y SUGERENCIAS
Pgina 42
BIBLIOGRAFIA Compiladores. Alfred V. Aho Editorial. Limusa Java a tope. Compiladores. Traductores y compiladores con Lex, Yacc, Jflex,cup y javacc. Sergio Glvez Rojas. Miguel ngel Mora Mata. Versin Electrnica, DEPSITO
LEGAL: MA-185-2005
OBJETIVO:
El anlisis sintctico consiste en identificar en un texto aquellas cadenas que se ajustan a (encajan en) unos conjuntos de reglas sintcticas, las cuales constituyen una gramtica. CUP(Constructor of Useful Parsers) es una herramienta que, a partir de la especificacin de
Pgina 43
una gramtica, es capaz de generar automticamente un analizador sintctico (o parser) en Java para dicha gramtica. Un ejemplo...
Pgina 44
Zona de declaraciones de precedencia y asociatividad: ayudan a resolver el anlisis sintctico en caso de que tengamos una gramtica ambigua. /* Cero o ms sentencias precedence (se estudiarn ms adelante. */ Zona de la gramtica: Contiene un conjunto de reglas (tambin llamadas producciones). La parte izquierda de cada regla debe ser un smbolo no terminal. La parte derecha de cada regla puede contener tanto terminales como no terminales, y puede tener asociada una accin (escrita en Java y enmarcada entre {: y :} ). El smbolo inicial se considera que es el no terminal de la parte izquierda de la primera regla, a menos que se indique uno explcitamente con la construccin start with no-terminal; en la zona de terminales y no terminales balanceados ::= NUM balanceados IDENT | ;
El analizador sintctico llama al mtodo next_token () del analizador lxico cada vez que necesita que se reconozca el siguiente token de la entrada
Pgina 45
La clase Symbol es tambin utilizada internamente por el analizador sintctico para representar tanto los smbolos terminales (tokens) como los no terminales. Patrones sintcticos Patrones no recursivos: Agregado. Opcin. Patrones recursivos: Lista simple (es decir, no anidada) Lista anidada Patrones no recursivos:
Pgina 46
Existen muchas variantes de la lista, como por ejemplo: Con separadores y sin delimitadores: azul / verde / rojo Sin separadores y con delimitadores: @ azul verde rojo @ Con separadores y con delimitadores: @ azul / verde / rojo @ En cada caso se puede admitir la lista vaca o no. A continuacin haremos algunos ejercicios de estos casos. Patrn recursivo: Lista Anidada Una lista anidada es aquella en la que alguno de sus elementos es a su vez una lista. Podemos tener combinaciones de los casos vistos antes. Por ejemplo: ( rojo [alto bajo] verde) 45 12 23 @ a b c @ 76 @ x y z @ 10
Pgina 47
Pgina 48
(Transmision.flex)Escriba un analizador sintctico que reconozca registros de transmisiones en un determinado protocolo. Un registro comienza con la palabra clave Begin_Transmissiony finaliza con End_Transmission. Entre ambas aparece una lista no vaca de elementos Begin_Block... End_Block(vase el ejercicio Block.flex). (ListaMinusculas.flex)Escriba un analizador sintctico que reconozca cualquier lista (posiblemente vaca) formada por letras minsculas que pueden estar separadas tanto por el smbolo # como por el . (Ticket.flex) Escriba un analizador sintctico que reconozca cualquier ticket de compra. Un ticket est formado por lneas. Cada lnea est formada por el nombre de un producto (entrecomillado) seguido del nmero de unidades compradas (nmero natural) y del importe parcial (en euros). Las lneas estn separadas por retornos de carro. Nota: cualquier ticket tiene, al menos, un producto. (Rutas.flex)Escriba un analizador sintctico que reconozca nombres de ficheros con sus rutas en DOS. Por ejemplo: C:\ejemplo\leeme.txt. Supngase que los nombres de directorios y archivos constan de un identificador o de un identificador seguido de un punto y de otro identificador (que hace las veces de extensin). (LlamadaFuncion.flex)Escriba un analizador sintctico que reconozca las llamadas simples a funciones en un lenguaje de programacin. Una llamada tiene elformato:identificador ( parmetros )donde parmetroses una secuencia (posiblemente vaca) de nmeros naturales e identificadores, separados por comas.
Pgina 49
%%
"BEGIN_BLOCK" {return new Symbol (symblock.BEGIN_BLOCK,yyline+1,yycolumn+1,yytext());} "END_BLOCK" {return new Symbol (symblock.END_BLOCK,yyline+1,yycolumn+1,yytext());}
Pgina 50
"msg" {return new Symbol (symblock.msg,yyline+1,yycolumn+1,yytext());} "ready" {return new Symbol(symblock.ready,yyline+1,yycolumn+1,yytext());} "ack" {return new Symbol(symblock.ack,yyline+1,yycolumn+1,yytext());} "alarm" {return new Symbol(symblock.alarm,yyline+1,yycolumn+1,yytext());}
{Blanco}+ {;} {NUM} {return new Symbol (symblock.NUM,yyline+1,yycolumn+1,new Integer (yytext()));} {IDENT} {return new Symbol(symblock.IDENT,yyline+1,yycolumn+1,yytext());} {CADENA} {return new Symbol(symblock.CADENA,yyline+1,yycolumn+1,yytext());}
terminal NUM, IDENT, CADENA,msg, ready, ack, alarm, BEGIN_BLOCK, END_BLOCK; non terminal cuerpo, inicio; inicio ::= BEGIN_BLOCK cuerpo END_BLOCK |; cuerpo ::= msg NUM IDENT IDENT CADENA |ready NUM |ready IDENT |ack NUM IDENT IDENT |alarm IDENT CADENA |;
Pgina 51
Pgina 52
ListaNumeros.flex import java_cup.runtime.Symbol; %% %class numeros2 %cupsym symnumeros2 %unicode %cup %line %column Blanco = [ \t\f] /*Salto = \r|\n|\r\n */ NUM=([0-9])+ %% {Blanco}+ {;} {NUM} {return new Symbol (symnumeros2.NUM,yyline+1,yycolumn+1,new Integer (yytext()));} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");}
CUP: terminal NUM; non terminal NUMEROS; NUMEROS ::= NUM NUMEROS |;
Pgina 53
Transmision.flex import java_cup.runtime.Symbol; %% %class cuerpo %cupsym symcuerpo PROGRAMACION DE SISTEMAS [Escriba texto]
Pgina 54
"BEGIN_TRANSMITION" {return new Symbol (symcuerpo.BEGIN_TRANSMITION,yyline+1,yycolumn+1,yytext());} "END_TRANSMITION" {return new Symbol (symcuerpo.END_TRANSMITION,yyline+1,yycolumn+1,yytext());} "BEGIN_BLOCK" {return new Symbol (symcuerpo.BEGIN_BLOCK,yyline+1,yycolumn+1,yytext());} "END_BLOCK" {return new Symbol (symcuerpo.END_BLOCK,yyline+1,yycolumn+1,yytext());} "msg" {return new Symbol (symcuerpo.msg,yyline+1,yycolumn+1,yytext());} "ready" {return new Symbol(symcuerpo.ready,yyline+1,yycolumn+1,yytext());} "ack" {return new Symbol(symcuerpo.ack,yyline+1,yycolumn+1,yytext());} "alarm" {return new Symbol(symcuerpo.alarm,yyline+1,yycolumn+1,yytext());} {Blanco}+ {;} {NUM} {return new Symbol (symcuerpo.NUM,yyline+1,yycolumn+1,new Integer (yytext()));} {IDENT} {return new Symbol(symcuerpo.IDENT,yyline+1,yycolumn+1,yytext());} {CADENA} {return new Symbol(symcuerpo.CADENA,yyline+1,yycolumn+1,yytext());} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");} Cup: terminal NUM, IDENT, CADENA,msg, ready, ack, alarm, BEGIN_BLOCK, END_BLOCK, BEGIN_TRANSMITION, END_TRANSMITION; non terminal cuerpo, inicio,ini; ini::= BEGIN_TRANSMITION inicio END_TRANSMITION |; PROGRAMACION DE SISTEMAS [Escriba texto]
Pgina 55
Pgina 56
Blanco = [ |\r|\n|\t|\f] LETRA=([a-zA-Z])+ %% {Blanco}+ {;} "-" {return new Symbol (symlistaminuscula.GI,yyline+1,yycolumn+1,yytext());} "#" {return new Symbol (symlistaminuscula.G,yyline+1,yycolumn+1,yytext());} {LETRA} {return new Symbol(symlistaminuscula.LETRA,yyline+1,yycolumn+1,yytext());} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");} CUP: terminal LETRA,GI,G;
non terminal lista; lista::= LETRA GI lista |LETRA G lista |LETRA G LETRA |LETRA GI LETRA |;
Pgina 57
Pgina 58
%% "." {return new Symbol(symticket.ready,yyline+1,yycolumn+1,yytext());} {Blanco}+ {;} {NUM} {return new Symbol (symticket.NUM,yyline+1,yycolumn+1,new Integer (yytext()));} {IDENT} {return new Symbol(symticket.IDENT,yyline+1,yycolumn+1,yytext());} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");} CUP: terminal NUM, IDENT,ready; non terminal inicio; inicio ::= IDENT NUM NUM ready NUM inicio |;
Pgina 59
Rutas.flex import java_cup.runtime.Symbol; %% %class rutas %cupsym symrutas %unicode %cup %line %column
":" {return new Symbol (symrutas.PUNTOS,yyline+1,yycolumn+1,yytext());} "." {return new Symbol (symrutas.PUNTO,yyline+1,yycolumn+1,yytext());} "/" {return new Symbol (symrutas.DI,yyline+1,yycolumn+1,yytext());} {Blanco}+ {;} {IDENT} {return new Symbol(symrutas.IDENT,yyline+1,yycolumn+1,yytext());} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");} CUP: terminal NUM, IDENT,ready; non terminal inicio; inicio ::= IDENT NUM NUM ready NUM inicio |;
Pgina 61
LlamadaFuncion.flex import java_cup.runtime.Symbol; %% %class llamadafuncion %cupsym symllamadafuncion %unicode %cup %line %column Blanco = [ |\r|\n|\t|\f] NUM=([0-9])+ LETRA=([a-zA-Z]) IDENT = {LETRA}({LETRA}|{NUM})*
%% {Blanco}+ {;} "(" {return new Symbol (symllamadafuncion.A,yyline+1,yycolumn+1,yytext());} ")" {return new Symbol (symllamadafuncion.C,yyline+1,yycolumn+1,yytext());} "," {return new Symbol (symllamadafuncion.CO,yyline+1,yycolumn+1,yytext());} {NUM} {return new Symbol (symllamadafuncion.NUM,yyline+1,yycolumn+1,new Integer (yytext()));} PROGRAMACION DE SISTEMAS [Escriba texto]
Pgina 62
{IDENT} {return new Symbol (symllamadafuncion.IDENT,yyline+1,yycolumn+1,yytext());} . {System.out.println("ERROR LXICO: Carcter \""+yytext()+"\" no permitido.");}
Pgina 63
%% %class Lexer %cup %line %column BLANCO=[ |\r|\n|\t|\f] NUM=[0-9]+ GATO = "#" PARA = "(" PARC = ")" %% {BLANCO}+ {;} {NUM} {return new Symbol(sym.NUM,yyline+1,yycolumn+1,new Integer(yytext()));} {GATO} {return new Symbol(sym.G,yyline+1,yycolumn+1);} {PARA} {return new Symbol(sym.PARA,yyline+1,yycolumn+1);} {PARC} {return new Symbol(sym.PARC,yyline+1,yycolumn+1);} . {System.out.println("ERROR LEXICO:" + " en la linea: " + (yyline+1) + " en la columna: " +(yycolumn+1) + " el token: " + yytext());} CUP: terminal NUM, G, PARA, PARC; non terminal lista, estructura; estructura ::= PARA lista PARC estructura |; lista ::= NUM G lista | NUM G NUM lista |;
Pgina 64
CUESTIONARIO
NOTAS Y SUGERENCIAS
Pgina 65
Java a tope. Compiladores. Traductores y compiladores con Lex, Yacc, Jflex,cup y javacc. Sergio Glvez Rojas. Miguel ngel Mora Mata. Versin Electrnica,
DEPSITO LEGAL: MA-185-2005
Pgina 66