03 2 1 SableCC
03 2 1 SableCC
03 2 1 SableCC
SableCC
Luis Gajardo [email protected]
Qu es SableCC?
SableCC fue creado por Etienne Gagnon como tesis de magister en la Universidad de McGill. Es un entorno orientado a objeto que permite la construccin de compiladores usando el lenguaje Java. Los compiladores construidos son de tipo Ascendentes (Bottom-Up). SableCC provee: Generador de Lexer (analizador lxico) usando AFD. Generador de Parser (analizador sintctico) usando gramticas LALR(1). Genera las clases que representan el rbol de parsing. Genera un visitador para el rbol. Generador de Pretty-printer SableCC es multiplataforma. El sitio web de este proyecto es http://www.sablecc.org
Instalacin de SableCC
Descargar el archivo sablecc-2.18.2.zip desde la plataforma PVA. La distribucin sirve tanto para Windows como para Linux. En Windows: Descomprimir el archivo en la raz del disco C (u otro seleccionado) Agregar a la variable PATH la siguiente ruta: c:\sablecc-2.18.2\bin Editar el archivo sablecc.bat ubicado dentro de la carpeta bin y escribir dentro de el la siguiente ruta absoluta: c:\sablecc-2.18.2\lib\sablecc.jar Ejecutar sablecc desde cualquier directorio. En Linux: Descomprimir el archivo en HOME Agregar a la variable PATH la siguiente ruta: $HOME/sablecc-2.18.2/bin Editar el archivo sablecc ubicado en la carpeta bin y colocar la ruta absoluta a sablecc.jar.
[<package declaration>] [<helper declarations>] [<states declarations>] [<token declarations>] [<ignored tokens>] [<productions>] States declarations tpicamente no se utiliza.
SableCC
Package declaration
Permite definir el directorio raz a partir del cual SableCC generar los archivos y subdirectorios de nuestro proyecto. Ejemplo: Package tarea.java.cc.simplyc; Esto generar la siguiente estructura de directorios:
Helper declarations
Supongamos que tenemos la siguiente expresin regular, definida en la seccin Token declarations: id = [a .. z] ([a .. z] | [0 .. 9])* Desearamos tener una forma ms abreviada y cmoda de representar lo mismo. Si declaramos la siguiente expresin regular en Token declarations: id = letter (letter | digit)* Entonces podramos usar las siguientes definiciones para letter y digit: letter = [a .. z]; digit = [0 .. 9]; De esta forma la seccin Helper declarations nos permite definir expresiones que nos ayudan a definir otras ms complejas.
Helper declarations
Otros ejemplos:
a = a | A ; b = b | B ; e = e | E ; g = g | G ; w = w | W; cr = 13 ; // retorno de carro o enter lf = 10 ; // alimentacin de lnea tab = 9 ; // tabulador ascii_char = [32 .. 127] ; blank = ; digit = [0 .. 9] ; letter = [[a .. z] + [A .. Z]] ; l_brace = { ; r_brace = } ; l_paren_star = (* ; r_paren_star = *) ;
Token declarations
Permite definir los tokens o smbolos terminales ms importantes de nuestra gramtica. Se debe decidir que declaraciones colocar en Helper y cuales en Token, aunque podramos tenerlas todas en Tokens. Ejemplos:
Tokens while = 'while'; begin = 'begin'; end = 'end'; do = 'do'; if = 'if'; then = 'then'; else = 'else'; semi = ';'; assign = '='; whitespace = (' ' | '\t' | '\n')+; id = ['a'..'z'](['a'..'z']|['0'..'9'])*;
Ignored tokens
Permite indicar cules tokens ignorar. Ejemplo:
Ignored tokens blank comment
Helper tab = 9 cr = 13 lf = 10 eol = cr lf | cr | lf blank = ( | tab | eol)+
La definicin de blank y comment puede ubicarse en la seccin Helper. Tpicamente un lenguaje de programacin ignora los comentarios y no forman parte del proceso de compilacin, es decir, no son procesados por lo cual en este caso esta seccin es muy til.
Productions
En esta seccin se definen las producciones de la gramtica del lenguaje. Esta definicin se realiza utilizando el formato BNF (Backus Naur Form) Ejemplo:
Productions expression = {plus} expression plus number | {minus} expression minus number | {number} number;
Finalmente, miramos el contenido del directorio postfix. Dentro de el deberan haber 4 subdirectorios llamados lexer, parser, node y analysis.
ctrl
enter
Si la expresin es aceptada, entonces el compilador no debera hacer nada, ya que an no hemos programado la semntica asociada. Si la expresin no es aceptada debera retornar algn error o error (mensajes en ingls, creados automticamente por SableCC) incluso terminar abruptamente debido a que tampoco hemos implementado el manejo de errores.
lexer
node
contiene la clase Parser, entre otras, la cual permite realizar el anlisis sintctico (chequeando el programa de entrada contra las producciones de la parser gramtica).
10
Esta clase posee dos atributos, Una expresin PExpr y un fin de archivo EOF. La clase Start siempre ser la primera, no importa la gramtica que utilicemos.
La palabra case se antepone a todos los mtodos que representan un nodo del rbol en el Visitor. En este caso caseStart visita a una instancia de la clase Start del rbol: 1. Primero se invoca a un mtodo (in) que ejecuta todo lo que queramos hacer antes de ingresar a los hijos de esta clase. 2. Luego se visitan los hijos 3. Finalmente se invoca a otro mtodo (out) que ejecuta todo lo que queramos hacer antes de salir de la clase.
11
infijo posfijo Para realizar esto crearemos una clase traductora llamada Translation (ubicada en postfix), la cual extender de DepthFirstAdapter (el visitador base). Luego sobre-escribiremos aquellas clases en las cuales se tenga que traducir alguna parte de la expresin.
12
public void outAPlusExpr(APlusExpr node) { //Al salir de {plus} en Expr, imprimimos el signo + System.out.print(node.getPlus()); } public void outAMinusExpr(AMinusExpr node) { //Al salir de {minus} en Expr, imprimimos el signo System.out.print(node.getMinus()); }
Los mtodos que no aparecen aqu no fueron sobre escritos y por lo tanto permanecen igual que en la clase DepthFirstAdapter.
13