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.
- Host: GitHub
- URL: https://github.com/arturoeanton/go-dsl
- Owner: arturoeanton
- License: apache-2.0
- Created: 2025-07-23T02:26:49.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2025-08-12T18:55:54.000Z (5 months ago)
- Last Synced: 2025-08-12T20:22:49.506Z (5 months ago)
- Topics: domain-specific-language, dsl, dsl-builder, go, golang, linq, rules
- Language: Go
- Homepage:
- Size: 70.8 MB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.es.md
- License: LICENSE
- Roadmap: ROADMAP.md
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