Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Interpretes CUP - Apuntes - Construcción de compiladores - Parte3, Apuntes de Ingeniería Infórmatica

Universidad Nacional Experimental del Táchira. Apuntes de Ingeniería Infórmatica. Construcción de compiladores. A continuación se explicará el funcionamiento básico de CUP (Java Based Constructor of Useful Parsers), centrándonos en los elementos principales que nos permiten la descripción de una gramática.

Tipo: Apuntes

2012/2013

Subido el 15/05/2013

Mauro_88
Mauro_88 🇻🇪

4.5

(213)

624 documentos

1 / 15

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Lista de símbolos
Los nombres (nombrei) de los terminales y no terminales no pueden ser
palabras reservadas de CUP. Esto incluye los siguientes identificadores:
El tipo de datos o clase de los terminales y no terminales es un parámetro
opcional sobre el que profundizaremos en el apartado siguiente. Para que la
“calculadora” que estamos desarrollando funcione, hará falta insertar un
código similar a éste:
docsity.com
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Interpretes CUP - Apuntes - Construcción de compiladores - Parte3 y más Apuntes en PDF de Ingeniería Infórmatica solo en Docsity!

Lista de símbolos

  • Los nombres (nombrei ) de los terminales y no terminales no pueden ser

palabras reservadas de CUP. Esto incluye los siguientes identificadores:

  • El tipo de datos o clase de los terminales y no terminales es un parámetro

opcional sobre el que profundizaremos en el apartado siguiente. Para que la

“calculadora” que estamos desarrollando funcione, hará falta insertar un

código similar a éste:

Especificaciones de importación

y empaquetamiento

  • La primera parte del archivo empieza con una declaración opcional de importaciones

y empaquetamiento. Estas declaraciones tienen la misma sintaxis y finalidad que en

un programa Java convencional.

  • Una declaración de empaquetamiento tiene la forma:

package nombre_package;

donde nombre_package es el identificador de un paquete (package) de Java.

  • La declaración de paquete indica el paquete en el que se ubicarán las clases sym y

parser generadas por el sistema.

  • A continuación de estas, se pueden incluir declaraciones de importación. Como en el

caso anterior, se utiliza la misma sintaxis que en Java, con dos alternativas:

import nombre_paquete.nombre_clase;

import nombre_paquete.*;

Código de usuario

2) Código añadido a la clase del analizador Se puede añadir código en la clase parser mediante la declaración:

parser code {: ...Código añadido al analizador... :};

Esto hace que el código definido se copie íntegramente en la clase:

public class parser extends java_cup.runtime.lr_parser { <código del analizador> ...Código añadido al analizador... }

Esta declaración se utiliza para particularizar el analizador, incluyendo métodos o, por ejemplo, sobrescribiendo los métodos de información de error predefinidos por CUP.

Código de usuario

3) Código previo al inicio del análisis

Este código se incluye en la clase parser, para que se ejecute antes de iniciar

la exploración (antes de solicitar el primer testigo al explorador).

Se declara:

init with {:

...Código Inicial...

El código se copia íntegramente en la función user_init de la clase parser:

public void user_init() throws java.lang.Exception

...Código Inicial...

Habitualmente se utiliza para inicializar el analizador y, especialmente,

tablas y otras estructuras que eventualmente se necesiten para las acciones

semánticas.

CUP proporciona tres métodos principales para informar de los errores que se producen durante la ejecución del analizador generado, situados en la clase lr_parser del runtime de CUP:

public void unrecovered_syntax_error (Symbol cur_token) throws java.lang.Exception

public void report_error (String message, Object info)

public void report_fatal_error (String message, Object info) throws java.lang.Exception

Declaraciones de precedencia y

asociatividad

  • En la tercera sección, que es

opcional, se especifica la precedencia y asociatividad de los terminales para aquellas gramáticas que sean ambiguas.

Declaraciones de precedencia y

asociatividad

Se dispone de tres tipos de declaraciones:

  • precedence left terminal11[, terminal12...];
  • precedence right terminal21[, terminal22...];
  • precedence nonassoc terminal31[, terminal32...];

que significan, en cuanto a precedencia:

  • Los terminales que se incluyen en las últimas listas tiene mayor precedencia que las que aparecen en las primeras. El orden de precedencia va de abajo hasta arriba.
  • Si un terminal no aparece en ninguna lista de precedencia, se entiende que tiene la precedencia mínima.

Declaraciones de precedencia y

asociatividad

Precedencia contextual

  • La asignación contextual de precedencia se sitúa al final de la

parte derecha de la producción y se utiliza para modificar la

precedencia que inicialmente se ha definido para los

terminales.

Calculadora muy simple

  • Con todo el desarrollo que hemos hecho hasta ahora ya

podemos crear el primer programa, consistente en la

gramática anterior. Inicialmente sólo haremos que el

programa identifique la validez de la ecuación introducida.

Calculadora muy simple