Skip to content

About

Implementación del lenguaje de programación FoxLite en Dart.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

23 Commits

Folders and files

Repository files navigation

FoxLite Interpreter

Dart Tests License Platform Libro

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.

¿Qué es FoxLite?

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.

Uso del lenguaje

Comentarios

&& Este es un comentario de una línea
saludo = "Hola Mundo" && Este es otro comentario

Tipos de datos

Tipo Ejemplo
Integer 1985
String "Hola" ó 'Hola'
Boolean .t. / .f.
Null .null.

Variables

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

Operadores

&& 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.

Salida de datos

? "Hola", "Mundo"
? 1985, "es mi año de nacimiento."
? .t., .f., 35, .null.

Control de flujo

if 5 != 5
    ? "son diferentes...!?"
else
    ? "mentira, son iguales..."
endif

i = 1
do while i <= 5
    ? i
    i = i + 1
enddo

Funciones

function sumar(a, b)
    return a + b
endfunc

? sumar(2, 3)

Funciones integradas

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)

Ejemplo

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

REPL

dart pub get
dart run

Cada 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

Compilar

dart compile exe bin/foxlite_interpreter.dart -o dist/foxlite_interpreter.exe

El ejecutable queda en dist/foxlite_interpreter.exe y no necesita Dart instalado.

Tests

dart test

Estructura

bin/
    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

Notas de la adaptación a Dart

El libro está escrito en Python; estas son las diferencias mínimas necesarias para portarlo a Dart sin cambiar el diseño:

  • Object, String y Function son identificadores propios de Dart, por eso el sistema de objetos usa FoxLiteObject, StringLiteral y FunctionObject.
  • to_string() se implementa como toString().
  • messagebox() usa dart:ffi en lugar de ctypes, y solo funciona en Windows.
  • Environment.set() usa un helper interno getEntry() porque en el libro get() devuelve el valor y set() necesita el par [scope, valor].

Licencia

MIT

About

Implementación del lenguaje de programación FoxLite en Dart.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages