Вы находитесь на странице: 1из 30

Plan

Notacin para especificar lenguajes (BNF y EBNF) Herramienta para generar analizadores sintcticos Presentacin del segundo obligatorio

BNF
(BackusNaur Form)
Notacin formal para definir la sintaxis de un lenguaje Usada por la mayora de los lenguajes de programacin Metasmbolos: ::= | {} [] se define como or repeticione opcionales

En general los terminales entre comillas y negrita ('a', '5')

Ejemplo BNF
Gramtica para representar nmeros numero decimal entPos digito ::= '-' decimal | decimal | '-' entPos | entPos ::= entPos '.' entPos ::= digito | digito entPos ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

E-BNF
Extended-BNF Se agregan las definiciones: ? Opcional * 0 a n veces + 1 a n veces

Ejemplo anterior con E-BNF


numero ::= '-' ? digito + ('.' digito +)?

digito ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

JCUP
Generador de analizadores sintcticos (parsers) en Java A partir de una gramtica especificada para JCUP (en nuestro caso el archivo Sintactico.sin), se genera automticamente el cdigo fuente java del parser (sym.java y parser.java). Luego se compila y generar el ejecutable .class (en nuestro caso: Principal.class)

E-BNF anterior
numero := '-' ? digito+ ('.' digito+)? digito := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'

import java_cup.runtime.*; import java.io.*; /* Opcional */ /* Terminales terminal

Gramtica para JCUP de ejemplo

(tokens reconocidos por el lexicografico). */ MENOS, PUNTO, DIGITO;

/* No terminales */ non terminal numero, enteroPositivo; /* Gramtica */ numero ::= MENOS enteroPositivo PUNTO enteroPositivo | enteroPositivo PUNTO enteroPositivo | MENOS enteroPositivo | enteroPositivo ; enteroPositivo ::= DIGITO enteroPositivo | DIGITO ;

JLEX
Reconoce los smbolos del lenguaje (palabras claves, identificadores, nmeros, strings, etc) Se aplican expresiones regulares Para el obligatorio se entrega hecho (Principal.java)

Comandos para el obligatorio


seteos.bat
configura el PATH y el CLASSPATH, hay que personalizarlo para cada PC, y ejecutarlo antes de los otros comandos

generar-parser.bat compilar.bat ejecutar.bat

genera los archivos sym.java y parser.java desde Sintactico.sin

compila los .java, devolviendo el ejecutable

ejecuta todo los test

comparar.bat

compara contra la salida oficial todos los test

Conflictos: shift/reduce o reduce/reduce


shift: se consume un smbolo de la tira y se pone en el stack. reduce: se cambian simbolos del stack por un no-terminal, correspondiente a una produccin de la gramtica. El parser puede tener conflictos: shift/reduce, el parser puede resolverlo tomando un comportamiento por defecto, no se recomienda. reduce/reduce, que representan ambigedades y no se permiten. Nota: en general se resuelven cambiando la gramtica.

Obligatorio
El trabajo consiste en generar parser usando JCUP que reconozca cdigo fuentes del lenguaje especificado en la E-BNF presentada en la letra del obligatorio. Y adems imprima ciertos textos a medida que se van reconociendo ciertas estructuras.

Obligatorio
Se presente en formato E-BNF la especificacin de un lenguaje similar a PL-SQL, pero modificado y ms sencillo. Un progrma PL-SQL tiene 3 secciones con: Declaraciones (opcional) Sentencias Excepciones (opcional)

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION NUMERO CONSTANTE

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION NUMERO CONSTANTE SENTENCIA DE ASIGNACION

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION NUMERO CONSTANTE SENTENCIA DE ASIGNACION EXCEPCION

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION NUMERO CONSTANTE SENTENCIA DE ASIGNACION EXCEPCION EXCEPCIONES

DECLARE suma NUMBER := 0; BEGIN FOR i IN (SELECT e FROM t) LOOP suma := suma + i; END LOOP; EXCEPTION WHEN no_data_found THEN suma := 0; END;

Ejemplo de entrada y salida


NUMERO CONSTANTE DECLARACION DECLARACIONES SENTENCIA DE SELECCION SIN WHERE SENTENCIA DE ASIGNACION SENTENCIA DE ITERACION NUMERO CONSTANTE SENTENCIA DE ASIGNACION EXCEPCION EXCEPCIONES BLOQUE

Respecto a la salida impresa, tener presente que:


JCUP es un LALR (Look-Ahead Left to Right) parser, que hace reconocimiento bottom-up.

Es decir reconoce de izquierda a derecha, y primero las hojas y luego el nodo padre. Tener presente lo anterior para generar la misma salida, que la oficial.

Los mensajes que se imprimen (1)


"BLOQUE", luego de reconocer el programa entero "DECLARACION", luego de reconocer una declaracin "DECLARACIONES", luego de reconocer toda la seccin de declaraciones. "EXCEPCION", luego de reconocer una declaracin. "EXCEPCIONES, luego de reconocer toda la seccin de declaraciones.

Los mensajes que se imprimen (2)


"SENTENCIA DE ASIGNACION", SENTENCIA CONDICIONAL IF, SENTENCIA CONDICIONAL IF-ELSE, SENTENCIA DE ITERACION, SENTENCIA DE SELECCION SIN WHERE y SENTENCIA DE SELECCION CON WHERE, luego de reconcer la sentencia correspondiente.

Los mensajes que se imprimen (3)


FACTOR LOGICO: EXPRESION SIMPLE ES NULO, FACTOR LOGICO: EXPRESION SIMPLE ES NO NULO, FACTOR LOGICO: A ENTRE B Y C, FACTOR LOGICO: A NO ENTRE B Y C, FACTOR LOGICO: EXISTE X, FACTOR LOGICO: (ENTRE PARENTESIS), segn el factor lgico que corresponda (logical_factor).

Los mensajes que se imprimen (4)


"LITERAL BOOLEANO: VERDADERO", LITERAL BOOLEANO: FALSO y LITERAL BOOLEANO: NULO, luego de reconcer el literal booleano correspondiente. "NUMERO CONSTANTE", luego que se reconoce una constante numrica ('numcte').

Вам также может понравиться