Teoría de Lenguajes Segundo Obligatorio 2014 El propósito del obligatorio es construir un programa que reconozca tiras de un lenguaje que se describirá a continuación. Para esto se utilizará la herramienta JCUP, que dada la especificación de una gramática, genera un programa java (el parser) que reconoce las tiras del lenguaje. Presentación del Lenguaje Para presentar el lenguaje se utilizará una gramática escrita en EBNF. Son símbolos del metalenguaje: * indica cero o más repeticiones + indica una o más repeticiones indica OR? indica 0 o 1 ocurrencia () se usa para agrupar dos o más términos a los que se le aplica un operador. Los símbolos terminales se describen entre comillas y en negrita. sql_program ::= ( sql_statement ';') + sql_statement ::= schema_stm data_stm schema_stm ::= create_stm drop_stm create_stm ::= create_table create_index create_table ::= 'create' 'table' 'id' ( '(' 'id' data_type ( ',' 'id' data_type ) * ')' 'as' '(' select_stm ')' ) data_type ::= 'varchar' 'integer' 'date' create_index ::= 'create' 'index' 'id' 'on' 'id' '(' 'id' ( ',' 'id' ) * ')' drop_stm ::= drop_table drop_index drop_table ::= 'drop' 'table' 'id' drop_index ::= 'drop' 'index' 'id' data_stm ::= data_change_stm select_stm data_change_stm ::= update_stm delete_stm insert_stm update_stm ::= update_simple update_subquery update_simple ::= 'update' 'id' 'set' 'id' '=' expression ( ',' 'id' '=' expression ) * ( 'where' condition )? update_subquery ::= 'update' 'id' 'set' '(' 'id' ( ',' 'id' ) * ')' '=' '(' select_stm ')' 1 de 5
delete_stm ::= 'delete' 'from' 'id' ( 'where' condition )? insert_stm ::= 'insert' 'into' 'id' '(' 'id' ( ',' 'id' ) * ')' ( value_list '(' select_stm ')' ) select_stm ::= 'select' ( '*' expression ( ',' expression ) *) 'from' 'id' (',' 'id' ) * ( 'where' condition )? value_list ::= 'values' '(' expression ( ',' expression ) * ')' expression ::= term ( ( '+' '-' ) term ) * term ::= factor ( ( '*' '/' ) factor ) * factor ::= constant 'id' 'id' '(' expression ( ',' expression ) * ')' condition ::= 'not'? logic_term ( 'or' logic_term ) * logic_term ::= logic_factor ( 'and' logic_factor ) * logic_factor ::= simple_expression ( compare_operator simple_expression) * simple_expression 'is' 'not'? 'null' 'exists' '(' select_stm ')' simple_expression 'not'? 'between' simple_expression 'and' simple_expression "(" condition ")" simple_expression ::= 'id' constant compare_operator ::= '=' '<' '>' '<>' '<=' '>=' constant ::= 'string' 'number' 2 de 5
Construcción del reconocedor gramatical (parser) Se le entregará al estudiante un programa Principal.java que contendrá el main del programa, código para reconocer los símbolos y la invocación al reconocedor gramatical. El estudiante deberá escribir en otro módulo (en el archivo: Sintactico.sin), el reconocedor gramatical para JCUP. En este al referirse a los terminales deberá usar los siguientes nombres, pues son los que se reconocen previamente en el reconocedor de símbolos por el programa Principal.java. Terminal Símbolo para JCUP "create" CREATE "index" INDEX "on" ON "table" TABLE "as" AS "drop" DROP "select" SELECT "from" FROM "where" WHERE "insert" INSERT "into" INTO "update" UPDATE "set" SET "exists" EXISTS "delete" DELETE "values" VALUES "not" NOT "and" AND "between" BETWEEN "is" IS "or" OR "null" NULL "varchar" VARCHAR "integer" INTEGER "date" DATE "+" MAS "-" MENOS "/" BARRA "*" ASTERISCO "<" MENOR ">" MAYOR "<=" MENORIGUAL ">=" MAYORIGUAL "<>" DISTINTO "=" IGUAL ";" PUNTOYCOMA "," COMA "(" CURIZQ ")" CURDER El símbolo ID (identificador) corresponde a una cadena de letras, dígitos y guión bajo ( _ ), que comienzan en letra. El símbolo STRING corresponde a una cadena de letras, dígitos, punto y guión bajo, y que va entre comillas simples. El símbolo NUMBER se corresponden a un número entero. En el reconocedor gramatical se deberá trabajar directamente con ID, STRING y NUMBER (estos ya habrán sido reconocidos por el reconocedor de símbolos). 3 de 5
Entorno de trabajo Se entregará un archivo comprimido (.zip) que contienen un directorio con lo siguiente: Un sub-directorio con las clases java correspondientes a JCUP y JLEX Los archivos de entrada, para lo cuales el parser verificará si son gramaticalmente correctos, e imprimirá determinadas salidas al ir reconociendo ciertas estructuras del lenguaje. Los archivos con las salidas "oficiales" correspondientes a los archivos de entrada. Un programa java (Principal.java) que contiene el analizador léxico e invoca al analizador sintáctico (o parser) que se pide realizar. Este programa deberá quedar intacto. El esqueleto del código fuente del analizador sintáctico (o parser) que se debe desarrollar en el laboratorio: Sintactico.sin Varios scripts para facilitar algunas tareas (*.bat en Windows, y *.sh en Linux): seteos.bat o seteos.sh: para setear las variables de entorno, generar-parser.bat o generar-parser.sh: para generar a partir del archivo Sintactico.sin el código java del parser en los archivos parser.java y sym.java compilar.bat o compilar.sh: para compilar el Principal.java junto con los archivos generados con el script anterior ejecutar.bat o ejecutar.sh para ejecutar el parser sobre los archivos de entrada, y generar la salida correspondientes comparar.bat o comparar.sh para comparar las salidas generadas con las oficiales El programa diff.exe para comparar las salidas. Para construir el Sintactico.sin se usará JCUP. Dichas herramientas generan código Java. Para trabajar en Java se recomienda el JDK (Java Development Kit) versión 1.2.2 o superior. Notas y consejos 1. Se deberá estudiar la salida que se imprime en cada caso, y agregar lo necesario en Sintactico.sin, de modo que las salidas del estudiante coincidan con las oficiales. 2. La solución del estudiante deberá ser idéntica a la solución "oficial". No debe haber diferencias entre ambas soluciones al ejecutar el utilitario diff.exe. Es decir, las mismas palabras, las mismas minúsculas y mayúsculas, los mismos espacios, etc. 3. Se recomienda hacer test de pruebas atendiendo todas las posibles sentencias que se puedan generar con la gramática. Desarrollo del trabajo Los trabajos se realizarán en grupos de 2 a 4 personas. Se sancionará con la pérdida del obligatorio si se detectan trabajos copiados, o si se hace una mala utilización del newsgroup. 4 de 5
Entrega Se realizará vía web, se comunicarán los detalles oportunamente. La misma se habilitará un par de días antes del vencimiento que es el día jueves 26 de junio hasta las 23:59 hs. Se deberán entregar los siguientes archivos: Sintactico.sin, con el analizador sintáctico, código fuente en JCUP Integrantes.txt, que contendrá la CI (7 dígitos) y el nombre de cada uno de los integrantes del grupo (sin usar tildes), y a continuación si desean hacer algún comentario sobre la ejecución. Formato de ejemplo del archivo integrantes.txt: 3123456,Gonzalez,Pablo 4567123,Martinez,Veronica 3444555,Garcia Rodriguez,Juan Jose Comentarios, solo si para algún test no funcionó bien. 5 de 5