CC4
  • Compiladores
  • Laboratorios
    • Lab 1 (COOL)
    • Lab 2 (Lexer)
    • Lab 3 (RDP)
    • Lab 4 (JCUP)
    • Lab 5 (Symbol Table)
    • Lab 6 (Análisis Semántico I)
    • Lab 7 (Análisis Semántico II)
    • Lab 8 (RISC-V)
    • Lab 9 (CodeGen I)
    • Lab 10 (CodeGen II)
    • Lab 11 (Optimizaciones)
  • Proyectos
    • Instalación Material
    • Análisis Léxico
    • Análisis Sintáctico
    • Análisis Semántico
    • Generación de Código
  • Manuales
    • Manual de COOL
    • Manual JLex
    • Manual JCup
    • COOL Runtime System
  • Guías
    • Guía CodeGen
Powered by GitBook
On this page
  • 1. Introducción
  • 2. Descripción
  • 3. Constant Folding
  • 4. Autograder

Was this helpful?

  1. Laboratorios

Lab 11 (Optimizaciones)

1. Introducción

El objetivo de este laboratorio es preparar el AST para la generación de código, aplicandole la optimización de Constant Folding.

Antes de empezar, obtener los archivos desde Github Classroom:

https://classroom.github.com/a/8GC__yJ-

2. Descripción

En lugar de generar código de forma directa, realizaremos una de las optimizaciones mas simples: aplicaremos Constant Folding a la gramatica empleada en el laboratorio anterior, la cual solo tiene definiciones de funciones, operaciones matematicas y condiciones. En los archivos que descargaron, se les proporciona el codigo base del lexer, parser y AST para que ustedes puedan agregar el código necesario para implementar las optimizaciones. Esta es la gramatica:

  P -> D P | D
  D -> def id(ARGS) = E;
  ARGS -> id, ARGS | id | lambda
  E -> int | id | if E = E then E else E | E + E | E - E | id(E,...,E)

3. Constant Folding

Para poder realizar esta fase, ustedes deben recorrer el AST de forma similar a la fase de semant, y la de cgen. El archivo que deben modificar es cool-tree.java, en la clase Main. Ahi deben implementar el metodo llamado optimize, el cual es su punto de inicio. Ademas de esto, son libres de modificar cualquier otra clase que deseen, como hint, otra clase que les seria util, podria ser TreeNode.java. Una vez implementada la función, si tienen el siguiente fragmento de código:

  def foo() = 2 + 3

su programa debera optimizarlo, operando la suma y luego escribiendo una unica constante, de la siguente manera:

  def foo() = 5

tomen en cuenta que para las llamadas a funciones tambien pueden realizar optimizaciones:

  foo(2*i,3*3)

lo cual deberian cambiarlo a:

  foo(2*i,9)

El output de su código debe ser el AST optimizado por lo que las operaciones matemáticas entre constantes deben aparecer como una sola constante (usted no debe preocuparse por desplegar el AST esto ya lo hace el código que se le proporciona, usted solo debe modificar la estructura del AST).

4. Autograder

Para comprobar que su código funciona correctamente, pueden escribir make check:

make check 
echo '#!/bin/sh' >> lab11
echo 'java -classpath /usr/class/cs143/cool/lib:.:/usr/java/lib/rt.jar:`dirname $0` Lab11 $*' >> lab11
chmod 755 lab11
python grading.py
##################### Autograder #######################
       +0 (test3.test)
       +0 (test2.test)
       +0 (test5.test)
       +0 (test4.test)
       +0 (test1.test)

+------------------------------------------------------+
|                                            Score: 0/5|
+------------------------------------------------------+

PreviousLab 10 (CodeGen II)NextInstalación Material

Last updated 5 years ago

Was this helpful?