Академический Документы
Профессиональный Документы
Культура Документы
CUP
recipe
La siguiente receta explica con un ejemplo como construir un analizador lxico con JFlex y
un analizador sintctico y semntico con CUP (obviamente para Java). Adems, muestra el
uso de producciones de error.
Requisitos
jflex - analizador lxico para Java
cup - analizador sintctico/semntico LALR para Java
Construccin
El ejemplo consiste en un conversor de unidades mtricas. Admitira textos de entradas del
siguiente tipo:
Entrada.txt
Km 1 mm;
dm 3 dm;
Hm 393 m;
Dm 54 cm, mm 3429 dm;
Km 23 Dm;
dm 322 cm, Hm 0923 mm;
y devuelve en consola:
Un archivo flex tiene la siguiente estructura (cada seccin se separa mediante %%) :
1. Cdigo de usuario
2. Opciones y declaraciones
3. Reglas lxicas
Conversor.lex
{WhiteSpace} { }
. {System.out.println("token ilegal <" + yytext()+ "> linea: " +
(yyline+1) + " columna: " + (yycolumn+1));}
}
Conversor.cup
int c=0,d=0;
System.out.print(n+" ");
if (a=="Km"){ c=6; System.out.print("Km"); }
else if (a=="Hm"){ c=5; System.out.print("Hm"); }
else if (a=="Dm"){ c=4; System.out.print("Dm"); }
else if (a=="m"){ c=3; System.out.print("m"); }
else if (a=="dm"){ c=2; System.out.print("dm"); }
else if (a=="cm"){ c=1; System.out.print("cm"); }
else if (a=="mm"){ c=0; System.out.print("mm"); }
if (b=="Km") d=6;
else if (b=="Hm") d=5;
else if (b=="Dm") d=4;
else if (b=="m") d=3;
else if (b=="dm") d=2;
else if (b=="cm") d=1;
else if (b=="mm") d=0;
:};
/* Declaracin de la lista de smbolos de la gramtica */
/* Declaracin de la gramtica */
programa ::= programa linea | linea;
Main.java
import java_cup.runtime.Symbol;
import java.io.*;
class Main {
static boolean do_debug_parse = false;
static public void main(String[] args) throws java.io.IOException {
parser parser_obj = new parser(new conversor(new
FileReader(args[0])));
Symbol parse_tree = null;
try {
if (do_debug_parse)
parse_tree = parser_obj.debug_parse();
else parse_tree = parser_obj.parse();
System.out.println("Entrada correcta");
} catch (Exception e) {
System.out.println("Horror");
}
}
}
Makefile
all: java
javac *.java
java:
jflex *.lex
cup *.cup
clean:
$(RM) *.class
$(RM) parser.java sym.java
$(RM) *~