Giter Site home page Giter Site logo

lang's Introduction

lang

Aquí vamos a registrar nuestro proyecto de crear un lenguaje de programación. Esto incluye el diseño de lenguaje y la implementación de un compilador.

Uso

Tenemos un Makefile con varios comandos:

  • make build-docker construye la imagen Docker para el sistema,
  • make run-docker ejecuta la imagen,
  • make run-tests ejecuta las pruebas unitarias.

Los siguientes comandos se deberían ejecutar en la terminal del contenedor, tras haber hecho make run-docker:

  • make install-dependencies instala las dependencias de Go,
  • make run-tests-ci ejecuta las pruebas que se van a hacer en la CI de GitHub,
  • make generate-parsing-files genera el código de ANTLR para el sistema. Se debería ejecutar si la gramática del lenguaje fue modificada o los archivos no existen. El código generado por ANTLR no es rastreado en este repositorio.

lang's People

Contributors

danilopedraza avatar thecomputercat avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

lang's Issues

Paso de CST a AST

Necesitamos, a partir del CST que nos da ANTLR4, obtener un AST que podamos caminar.

Diseño del lenguaje

Tenemos que establecer una forma de describir el lenguaje. No necesariamente debe ser una gramática, pero debe estar en algún lado. Luego usaremos ese medio para construirlo.

Assert

Necesitamos una forma de detener la ejecución del programa si una condición no se cumple. Esto sería una función así:

assert(cond, msg)

donde cond es un booleano y msg es un mensaje que se quiera desplegar cuando el booleano sea falso y la ejecución se detenga.

Sintaxis para ciclos infinitos

Decidir la sintaxis para ciclos infinitos en reemplazo de las intrucciones tipo while. Un ejemplo propuesto es:

loop:
    int a := 5
    if a = 5:
        break

Creación del ambiente Docker

Crear el ambiente virtual en un contenedor de Docker que incluya:

  • Instalaciones de Java
  • Instalaciones de ANTLR4
  • Instalaciones de Go

Operadores

Hay que añadir operadores para el lenguaje. Esta es una lista inicial:

  • Prefijos/Posfijos
    • - Inverso aditivo
    • ~ Negación bitwise
    • ! Negación lógica
  • Infijos
    • + Suma/Concatenación
    • - Resta
    • * Multiplicación
    • / División
    • % Residuo
    • ** Potenciación
    • ^ Bitwise XOR
    • | Bitwise OR
    • & Bitwise AND
    • >> Desplazamiento a la dereche
    • << Desplazamiento a la izquierda
    • <= Menor o igual
    • >= Mayor o igual
    • == Igual
    • != No igual
    • || OR lógico
    • && AND lógico

Implementación

Hay que decidir que vamos a usar para implementar el lenguaje. En principio, queremos decidir entre Rust y Go.

Utilidades para pruebas unitarias

Se necesita que la biblioteca estándar tenga utilidades para hacer pruebas unitarias. No pensamos en este lenguaje como uno dinámico, así que no estoy seguro de que la fórmula describe/it funcione bien.

Objetivo de compilación

En principio queremos que el lenguaje sea compilado. No hemos establecido cual será nuestro primer objetivo de compilación. La idea de compilar a WASM ha resonado y creo que nos agrada a muchos.

Estilo de comentarios

Decidir el estilo de los comentarios de una linea, multilinea y strings de documentación. Algunos ejemplos

Estilos de comentario una linea

  • Python #
  • Java //
  • Lean --
  • Ocaml (* *)

Estilos de comentarion multilinea

  • Python """ """
  • Java /* */

Strings de documentación

  • Python docstring
  • Java Javadoc
  • Rust Doctests

Utilidades I/O

Necesitamos utilidades para obtener texto de stdin y enviar a stdout. podríamos empezar con funciones simples como println y getln. Luego añadiríamos soporte más granular para manipular los buffers.

Mutabilidad de valores

La idea es incluir la mutabilidad de valores para todos los tipos con una sintaxis como:
let int a := 5
mut int a := 5

Análisis estático

Se debe poder verificar la congruencia de las operaciones del lenguaje. En particular, se debería verificar:

  • Existencia de valores que son invocados
  • Congruencia entre parámetros y argumentos de funciones
  • Existencia de código muerto:
    • Valores sin usar
    • Sentencias a las que nunca se llega

Investigación ANTLR4

Preparar un reporte sobre la funcionalidad de ANTLR4 para las tareas de crear el lexer y parser

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.