A continuación detallaré como se estructura un archivo de entrada para Cup.
Básicamente un archivo para Cup tiene la siguiente estructura:
< imports java > < codigo del usuario para el parser> <codigo del usuario para las acciones de la gramatica> < Declaracion de Variables para la gramatica> <Gramatica>
Imports: En esta sección creo que no tengo que ampliar mucho desde que programamos Java sabemos como son los imports de librerias.
Código del Usuario para el Parser: Como el código Java es generado por la herramienta es muy difícil modificar lo en el archivo de salida. Así que aquí podemos declarar métodos y variables que pensamos usar en la clase resultante. Si se declaran variables o métodos públicos en esta sección estos podran ser accedidos por otras clases.
Se declara:
parser code {: /* Codigo del parser*/:}
Código del Usuario para las Acciones de la Gramática: Como nuestro propósito es el de generar un Compilador con estas herramientas o un interprete, necesitamos generar una salida ya sea esta errores semánticos, sintácticos o traducción a un código equivalente, para esto tenemos que hacer uso de traducciones dirigidas por sintaxis.
Sería muy engorroso programar largas funciones en cada acción del gramática así que estas las podemos declarar en esta sección y solo mandarlas a llamar en cada acción gramatical.
Se declara de la siguiente manera:
action code {:/*Codigo para las acciones*/:}
Declaración de Variables para la Gramática : En esta sección toca declarar las variables que se utilizaran en la gramática, estas variables pueden ser de dos tipos:
- Variables Terminales < terminal>
- Variables No Terminales <non terminal>
Las variables terminales serán todos los símbolos terminales de la gramática y las variables No-Terminales serán todas las variables que representaran producciones.
La sintaxis para la declaración es la siguiente:
<tipo de variable> < tipo de dato > < id de la variable >
Donde <tipo de variable > puede ser Terminal o No terminal
<tipo de dato> puede ser cualquier tipo de dato primitivo de Java o uno creado por nosotros mismos. Si se no se especifica el tipo de dato Cup lo trabajará como un tipo de dato Symbol.
<id de la variable > aquí se especifica el id de la variable, se puede usar una lista de identificadores separadas por coma si deseamos variables del mismo tipo.
Gramática: En esta sección del archivo es donde escribiremos nuestra gramatica. La gramatica tiene la siguiente sintaxis :
<non terminal > ::= < terminales o No terminales > ;
Como un no terminal puede tener mas de un lado derecho en Cup se utiliza el simbolo «|»
<non terminal > ::= < terminales o No terminales > |<terminales o No terminales> ;
Como es esperado se pueden escribir muchas producciones.
Ejemplo de un archivo cup para una Expresion Booleana:
/*Por el momento dejaremos el action code y parser code vacios esto se explicara mas a detalle en otra seccion del tutorial*/ action code{::} parser code{::} /*Declaracion de variables no terminales*/ non terminal COND, OREXP,ANDEXP,IGEXP,CMP,SIMBOLOSCOMPARAR,TIPO_DATO; /*DECLARACION DE VARIABLES TERMINALES */ terminal or_,and_,igual_igual,no_igual,mayor, menor, mayor_igual,menor_igual, open_par,close_par,id,numero,true,false; Start with COND; // start with sirve para indicarle al parser con que produccion empezar COND::=OREXP; OREXP::=OREXP or_ ANDEXP |ANDEXP; ANDEXP::=ANDEXP and_ IGEXP |IGEXP; IGEXP::= IGEXP igual_igual CMP |IGEXP no_igual CMP |CMP; SIMBOLOS_COMPARAR::=mayor |menor |mayor_igual |menor_igual; CMP::= CMP SIMBOLOS_COMPARAR TIPO_DATO |TIPO_DATO |open_par COND close_par ; TIPO_DATO::= id |numero |true |false;
Deja una respuesta