AjSharp: un intérprete a la C Sharp, trabajo en progreso

El pasado mes publiqué un proyecto en Google code:

http://code.google.com/p/ajbasic/

Es un intérprete AjBasic, escritbo en VB.NET. El código es la evolución de mi trabajo previo, para mi proyecto de generación de código AjGenesis. En esta nueva versión, el intérprete fue separado en un proyecto aparte, y la gramática de AjBasic y su compilador residen en otro proyecto.

Esa forma de trabajo permite escribir otra gramática y compilador, usando como salida el mismo intérprete núcleo. Así nace AjSharp: pueden bajarlo del mismo repositorio de código de AjBasic.

La solución

Tiene varios proyectos. El proyecto AjInterpreter es exactamente el mismo que en la solución AjBasic. Así, ambas soluciones comparten la misma implementación núcleo de sus primitivas.

El proyecto AjSharp contiene el nuevo compilador, que reconoc código AjSharp, como:

printline "Hello World";


Hay algunos verbos, tomados de AjBasic, como  print y printline. Pero el resto de los verbos son más tipo C#. Mi plan es incluir estas nuevas versiones de AjBasic y AjSharp en el próximo release de AjGeesis, así los que escriban plantillas (templates) para AjGenesis puedan usar cualquiera de los dos lenguajes (está planeado usar un lenguaje .NET directamente, pero esa capacidad quedará para incluir en otra versión futura de AjGenesis).


Como mencionaba en mis anteriores posts:

AjBasic- un intérprete Basic de código abierto
AjBasic- an open source Basic-like interpreter

AjBasic nació para soportar la generación de código en AjGenesis. Lo diseñé para manejar objetos .NET nativos, y también objetos dinámicos. Ahora, eso también está soportado en AjSharp. Un objeto dinámico es un objeto que no tiene una clase, pero que puede soportar nuevas propiedades, definidas en el momento (el ejemplo más cercano que puedo pensar como parecido, son los objetos Javascript).

Podemos escribir código en AjSharp como:

a.FirstName = “Adam“; 

a.LastName = “Doe“;

a.Age = 800;

No hace falta declarar la variable. El objeto se crea y se agrega la propiedad FirstName, en un solo comando (esta creación automática de objetos no está soportada en AjGenesis, todavía).

Podemos preguntar por la existencia de una propiedad:

if (a.LastName)
    printline “a has last name”;
else
    printline “a hasn’t last name”;


Si la variable a no tiene un valor asignado (no existe), o si existe pero no tiene propiedad LastName, la condición de arriba se evalúa a falso. Podemos preguntar por algo como foo.bar.anything y si foo no existe, no aparece ninguna excepción de referencia a null. El resultado completo de esa expresión será, no error, sino null, y en estos lenguajes, null es falso para una condición.

Podemos acceder a objetos .NET, también. Un ejemplo:

di = new System.IO.DirectoryInfo(“.”);

foreach (fi in di.GetFiles()) {
    printline System.String.Format(“File {0}”,fi.Name);
}

El intérprete


El núcelo de AjBasic y AjSharp, es el proyecto AjInterpreter, una vista parcial:


Tiene varios nodos definidos, que se usan para formar un árbol de evaluación. Ambos compiladores analizan texto, y lo conviernte a una representación de árbol de nodos AjInterpreter. Hay dos clases principales de esos objetos: Expressions y Commands. Un nodo expression puede ser evaluado, retornando un objeto arbitrario. Un nodo command es ejecutado. Ambas operaciones trabajan sobre un environment, que contiene las variables y sus valores asociados.


Los tests


El compilador, scanner y otros objetos auxiliares, fueron escritos con tests. En la versión publicada, los tests estan en verde:


Consola y GUI


AjSharp.Console es un pequeño programa para probar código AjSharp. Podemos ejecutar archivos .ajs si los colocamos como argumentos, o ingresar comandos por la consola:



AjSharp.GUI is un “feo” programa, que sólo muestra que podemos invocar al intérprete desde un programa WinForm:



Trabajo en progreso


El código actual de AjSharp (y de AjBasic) contiene nuevas características, como el soporte de try/catch/finally en los lenguajes.


Todo este trabajo es trabajo en progreso. Próximos pasos:


- Integrar AjBasic y AjSharp en la próxima versión de AjGenesis


- Soporte para System.Array en ambos intérpretes


- Agregado de un comando for en AjBasic (hay un for each en ambos, y un for tipo C# en AjSharp)


- Operadores de incremento y decremento


- Y mil ideas más… ;-)


Hay dos caminos en el futuro: portar este trabajo a Java, y/o integrar esto con el nuevo soporte de Dynamic Language de .NET. Pero por ahora, integración con AjGenesis es la prioridad. Y, debo confesarlo, este trabajo me divierte mucho.. ;-)


Nos leemos!


Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez


This entry was posted in 1389, 6145, 8596, 8926. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>