# Constant Folding

# Objetivos

Construya un paquete npm y publíquelo en npmjs (opens new window) con ámbito @aluXXX y con nombre constant-folding

El módulo además de exportar la función constantFolding provee un ejecutable cf que se llama así:

cf input.js output.js
1

el cual realiza la transformación de plegado de constantes sobre input.js dejando la salida en output.js.

Una parte de los conceptos y habilidades a adquirir con esta práctica se explican en la sección Creating and publishing a node.js module en GitHub y en NPM. Léala con detenimiento antes de hacer esta práctica.

# Ámbitos

Deberá publicar el paquete en npmjs (opens new window) con ámbito @aluXXX y con nombre constant-folding.

Para saber sobre ámbitos, vea la sección Scopes and Registries.

# Pruebas

Deberá añadir pruebas usando Mocha y Chai o Jest. Repase las secciones Testing with Mocha and Chai y Jest.

# Documentación

Documente el módulo incorporando un README.md y la documentación de la función exportada usando JsDoc. Repase la sección Documenting the JavaScript Sources

# Pruebas de Producción

En el repo asignado testing-constant-folding-aluXXX añada las pruebas necesarias para comprobar que la última versión del paquete publicado se instala y puede ser usado. Repase la sección Testing in Production

# Superproject with Git Submodule

Usando git submodule configure como super-project el repo asignado super-constant-folding-aluXXX para que contenga a a los dos repos: en el que ha desarrollado el módulo npm constant-folding-aluXXX y el repo para las pruebas en tiempo de producción testing-constant-folding-aluXXX.

El informe de la práctica README.md se hace en este repo.

Repase la sección Making a Project with the two repos: git submodule

# Challenge: Constant Folding of MemberExpression literals

Añada ahora plegado de constantes para métodos (con argumentos plegables) y propiedades de los arrays. Esto es, expresiones como:

["a", "b", "c"].concat(["d", "e"], "f", "g", ["h"]);
["a", "b", "c"].join();
["a", "b", "c"].join('@');
[1, 2, 3].length;
[1, 2, 3][2-1];
[1, 2, 3].shift();
[1, 2, 3].slice(0, 1+1);
[a, b, c].pop(); // substitute the MemberExpression node by the last AST in the "elements" array of the object Array Expression
[a, b, c].reverse(); // reverse the ASTs
1
2
3
4
5
6
7
8
9

Serán evaluadas en tiempo de compilación produciendo:

["a", "b", "c", "d", "e", "f", "g", "h"];
"a,b,c";
"a@b@c";
3;
2;
2;
[1, 2];
c;
[c, b, a];
1
2
3
4
5
6
7
8
9

Implemente las transformaciones necesarias para cubrir al menos tres de los ejemplos mostrados arriba.

Publique ahora esta mejora en la funcionalidad del módulo.

¿Como debe en cambiar el nº de versión?

Repase la sección Semantic Versioning

Other possible optional extensions are:

  • Constant folding for methods and properties of Literal Strings:

    "abc"[0];
    "abc".charAt();
    "abc".charAt(1);
    "abc".length;
    "a,b,c".split(",");
    
    1
    2
    3
    4
    5
  • Constant folding for methods and properties of Objects, Numbers, etc.

    {a:4, b:5}.b
    (100 + 23).toString();
    
    1
    2

# References

# Constant Folding

# Packages

# Testing and Documentation

# Semantic versioning and npm

Grading Rubric#

#Labs

  1. Task GitHub-AluXXXX Form
  2. Lab GitHub Campus Expert
  3. Lab GitHub Project Board
  4. Lab GitPod and Visual Studio Code
  5. Lab IAAS
  6. Lab Espree Logging
  7. Lab Hello Compilers
  8. Lab Constant Folding
  9. Lab ast-types
  10. Lab egg-parser
  11. Lab Lexer Generator
  12. Lab The Egg Interpreter
  13. Lab Adding OOP to the Egg Parser
  14. Lab Extending the Egg Interpreter
  15. Lab TFA: Final Project PL
  16. Task Training Exam for PL

Comments#

Last Updated: 13 minutes ago