Implementación del lenguaje de programación FoxLite en Dart.
Este proyecto sigue el enfoque presentado en el libro Cómo crear un Lenguaje de Programación ¡Sin morir en el intento! de Irwin Rodríguez, pero la implementación está realizada en Dart.
El libro construye el intérprete en Python, capítulo por capítulo. Este repositorio es un seguimiento fiel de ese mismo camino: la gramática, el AST, el sistema de objetos, el evaluador y las funciones integradas se mantienen iguales; solo cambia el lenguaje de implementación.
FoxLite es un subconjunto pequeño de Visual FoxPro. Es un lenguaje estructurado, sensible a mayúsculas, con tipos nativos, control de flujo, funciones definidas por el usuario y funciones integradas. No tiene programación orientada a objetos.
&& Este es un comentario de una línea
saludo = "Hola Mundo" && Este es otro comentario
| Tipo | Ejemplo |
|---|---|
| Integer | 1985 |
| String | "Hola" ó 'Hola' |
| Boolean | .t. / .f. |
| Null | .null. |
public nombre
local contador
private acumulado
Una declaración de variable se enlaza por defecto con .f.. También se puede asignar directamente:
nombre = "FoxLite"
contador = 10
&& Unarios
!.t.
-35
&& Aritméticos
1 + 2
10 - 5
3 * 4
10 / 2
&& Relacionales
5 < 10
5 <= 5
10 > 3
10 >= 10
5 == 5
5 != 3
&& Lógicos
.t. and .f.
.t. or .f.
? "Hola", "Mundo"
? 1985, "es mi año de nacimiento."
? .t., .f., 35, .null.
if 5 != 5
? "son diferentes...!?"
else
? "mentira, son iguales..."
endif
i = 1
do while i <= 5
? i
i = i + 1
enddo
function sumar(a, b)
return a + b
endfunc
? sumar(2, 3)
| Función | Descripción |
|---|---|
len(str) |
Devuelve la longitud de una cadena |
type(valor) |
Devuelve C, L, N ó X según el tipo |
alltrim(str) |
Elimina los espacios de los extremos |
messagebox(msg, titulo) |
Muestra un cuadro de diálogo (solo Windows) |
function fibonacci(n)
if n <= 1
return n
else
return fibonacci(n-1) + fibonacci(n-2)
endif
endfunc
i = 1
do while i <= 10
? fibonacci(i)
i = i + 1
enddo
dart pub get
dart runCada línea que termine en ; continúa en la siguiente, igual que en Visual FoxPro. quit cierra el REPL.
>> function fibonacci(n);
>> if n <= 1;
>> return n;
>> else;
>> return fibonacci(n-1) + fibonacci(n-2);
>> endif;
>> endfunc
function
>> fibonacci(10)
55
>> ? "Hola " + "mundo"
Hola mundo
>> a = 10
10
>> alltrim(" FoxLite ")
FoxLite
dart compile exe bin/foxlite_interpreter.dart -o dist/foxlite_interpreter.exeEl ejecutable queda en dist/foxlite_interpreter.exe y no necesita Dart instalado.
dart testbin/
foxlite_interpreter.dart Punto de entrada
lib/
ast/ Nodos del árbol de sintaxis abstracta
builtins/ Funciones integradas
environment/ Entornos y tabla de símbolos
evaluator/ Evaluador del AST
lexer/ Analizador léxico
object/ Sistema de objetos
parser/ Analizador sintáctico
repl/ REPL v1, v2 y v3
docs/
grammar.md Gramática libre de contexto de FoxLite
test/
foxlite_interpreter_test.dart
El libro está escrito en Python; estas son las diferencias mínimas necesarias para portarlo a Dart sin cambiar el diseño:
Object,StringyFunctionson identificadores propios de Dart, por eso el sistema de objetos usaFoxLiteObject,StringLiteralyFunctionObject.to_string()se implementa comotoString().messagebox()usadart:ffien lugar dectypes, y solo funciona en Windows.Environment.set()usa un helper internogetEntry()porque en el libroget()devuelve el valor yset()necesita el par[scope, valor].
MIT