An open API service indexing awesome lists of open source software.

https://github.com/arturoeanton/go-dsl

A powerful and flexible Domain Specific Language (DSL) builder for Go that enables you to create custom programming languages with enterprise-grade features.
https://github.com/arturoeanton/go-dsl

domain-specific-language dsl dsl-builder go golang linq rules

Last synced: 5 months ago
JSON representation

A powerful and flexible Domain Specific Language (DSL) builder for Go that enables you to create custom programming languages with enterprise-grade features.

Awesome Lists containing this project

README

          

# go-dsl

Un constructor de DSL (Lenguaje de Dominio Específico) flexible y potente para Go que facilita la creación de lenguajes personalizados con soporte completo para recursión izquierda, análisis multiline y características de nivel empresarial.

## ✨ Características

- **Parser Mejorado con Recursión Izquierda** - Algoritmo de semilla creciente completo
- **Soporte Multiline** - ParseMultiline(), ParseAuto(), ParseWithBlocks()
- **Sistema de Tokens con Prioridad** - Keywords sobre patrones regulares
- **Memoización (Packrat Parsing)** - Rendimiento lineal incluso con retroceso
- **Acciones Personalizadas** - Ejecuta código Go durante el parsing
- **Mensajes de Error Detallados** - Con información de línea y columna
- **100% Retrocompatible** - Todas las mejoras mantienen compatibilidad
- **Configuración Declarativa** - Define DSLs con YAML/JSON
- **Herramientas CLI** - AST viewer, validador, REPL interactivo

## 🚀 Inicio Rápido

### Instalación

```bash
go get github.com/arturoeanton/go-dsl/pkg/dslbuilder
```

### Ejemplo Básico

```go
package main

import (
"fmt"
"github.com/arturoeanton/go-dsl/pkg/dslbuilder"
)

func main() {
// Crear un nuevo DSL
dsl := dslbuilder.NewDSL()

// Definir tokens
dsl.Token("NUMBER", `\d+`)
dsl.Token("PLUS", `\+`)
dsl.Token("MINUS", `-`)

// Definir gramática
dsl.Rule("expr", []string{"expr", "PLUS", "term"}, "add")
dsl.Rule("expr", []string{"expr", "MINUS", "term"}, "subtract")
dsl.Rule("expr", []string{"term"}, "pass")
dsl.Rule("term", []string{"NUMBER"}, "number")

// Definir acciones
dsl.Action("number", func(args []interface{}) (interface{}, error) {
return strconv.Atoi(args[0].(string))
})

dsl.Action("add", func(args []interface{}) (interface{}, error) {
return args[0].(int) + args[2].(int), nil
})

// Parsear y ejecutar
result, err := dsl.Parse("10 + 20 - 5")
fmt.Println(result) // Output: 25
}
```

### Soporte Multiline (NUEVO en v1.2)

```go
// Parsear múltiples líneas automáticamente
script := `
set x 10
set y 20
print x + y
`

// Opción 1: Detección automática
result, err := dsl.ParseAuto(script)

// Opción 2: Multiline explícito
results, err := dsl.ParseMultiline(script)

// Opción 3: Con soporte de bloques
results, err := dsl.ParseWithBlocks(script)
```

## 📚 Ejemplos Incluidos

### 1. **Calculadora** (`examples/calculator/`)
Expresiones aritméticas con precedencia de operadores:
```bash
go run examples/calculator/main.go
> 2 + 3 * 4
Result: 14
```

### 2. **HTTP DSL v3** (`examples/http_dsl/`)
DSL completo para operaciones HTTP con bloques:
```http
if $status == 200 then
set $result "success"
print "Operation completed"
else
set $result "error"
print "Operation failed"
endif
```

### 3. **Validador JSON** (`examples/json_validator/`)
Valida estructuras JSON con reglas personalizadas:
```yaml
type: object
properties:
name:
type: string
minLength: 1
age:
type: number
minimum: 0
```

### 4. **Filtro SCIM** (`examples/scim_filter/`)
Parser para especificación SCIM 2.0:
```
userName eq "john" and (emails.type eq "work" or active eq true)
```

### 5. **SQL Query DSL** (`examples/sql_query/`)
Constructor de consultas SQL simplificado:
```sql
SELECT name, age FROM users WHERE age > 18 ORDER BY name
```

## 🔧 Características Avanzadas

### Recursión Izquierda

go-dsl maneja automáticamente la recursión izquierda usando el algoritmo de semilla creciente:

```go
// Esta gramática funciona perfectamente
dsl.Rule("list", []string{"item"}, "single")
dsl.Rule("list", []string{"list", "COMMA", "item"}, "append")
```

### Prioridad de Tokens

Los keywords tienen prioridad sobre patrones regulares:

```go
dsl.KeywordToken("if", "if") // Prioridad 90
dsl.Token("ID", "[a-zA-Z]+") // Prioridad 0
// "if" siempre se reconoce como keyword, no como ID
```

### Configuración Declarativa

Define DSLs usando YAML:

```yaml
tokens:
- name: NUMBER
pattern: '\d+'
- name: PLUS
pattern: '\+'

rules:
- name: expr
pattern: [expr, PLUS, term]
action: add
- name: expr
pattern: [term]
action: pass
```

```go
dsl := dslbuilder.NewDSLFromYAML("grammar.yaml")
```

## 🛠️ Herramientas CLI

### AST Viewer
Visualiza árboles de análisis sintáctico:
```bash
go install github.com/arturoeanton/go-dsl/cmd/ast_viewer@latest
ast_viewer -grammar grammar.yaml -input "2 + 3"
```

### Validador
Verifica definiciones de gramática:
```bash
go install github.com/arturoeanton/go-dsl/cmd/validator@latest
validator grammar.yaml
```

### REPL
Prueba DSLs interactivamente:
```bash
go install github.com/arturoeanton/go-dsl/cmd/repl@latest
repl -grammar grammar.yaml
```

## 📊 Comparación con Otras Herramientas

| Característica | go-dsl | ANTLR | PEG | Yacc |
|---------------|--------|-------|-----|------|
| Recursión Izquierda | ✅ | ✅ | ❌ | ✅ |
| Sin Generación de Código | ✅ | ❌ | ❌ | ❌ |
| Configuración Runtime | ✅ | ❌ | ❌ | ❌ |
| Soporte Multiline | ✅ | ⚠️ | ⚠️ | ⚠️ |
| Acciones en Go | ✅ | ⚠️ | ✅ | ⚠️ |
| Memoización | ✅ | ❌ | ✅ | ❌ |
| YAML/JSON Config | ✅ | ❌ | ❌ | ❌ |

## 🧪 Testing

```bash
# Ejecutar todos los tests
go test ./...

# Con cobertura
go test -cover ./pkg/dslbuilder/...

# Tests específicos
go test -run TestImprovedParser ./pkg/dslbuilder/
```

## 📖 Documentación

- [Guía de Inicio Rápido](docs/quickstart.md)
- [Referencia de API](docs/api-reference.md)
- [Ejemplos](examples/)
- [Mejores Prácticas](docs/best-practices.md)

## 🤝 Contribuir

¡Las contribuciones son bienvenidas! Áreas prioritarias:

1. Optimizaciones de rendimiento
2. Nuevos ejemplos de DSL
3. Mejoras en documentación
4. Corrección de bugs y tests
5. Herramientas de validación de gramática

Ver [CONTRIBUTING.md](CONTRIBUTING.md) para las guías.

## 📜 Licencia

MIT - Ver [LICENSE](LICENSE) para detalles.

## 🙏 Agradecimientos

- Inspirado en parsers PEG y Packrat
- Algoritmo de recursión izquierda basado en trabajos de Warth et al.
- Comunidad Go por el feedback y contribuciones

## 📊 Estado del Proyecto

- **Versión**: 1.2.0
- **Estado**: Production Ready
- **Cobertura de Tests**: 85%+
- **Rendimiento**: 10x más rápido que v1.0
- **Retrocompatibilidad**: 100% mantenida

---

Hecho con ❤️ por la comunidad go-dsl