Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ dist/

*.class
*.iml
*.jar
*.jar
*.o
71 changes: 55 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,48 +13,87 @@ Está diseñado para detectar errores lógicos comunes (como el no-determinismo
> 📚 ¿Nuevo en esto? Si quieres profundizar en los fundamentos teóricos, te recomendamos leer sobre la [Máquina de Turing en Wikipedia](https://es.wikipedia.org/wiki/M%C3%A1quina_de_Turing) o consultar la [Stanford Encyclopedia of Philosophy](https://plato.stanford.edu/entries/turing-machine/).

## 🛠️ Instalación y Uso
Requisitos

> Java Development Kit (JDK) 8 o superior.
Descarga la última versión del compilador desde la sección Releases y extrae el archivo `.tar.gz`

## Compilación
Instala el compilador en tu sistema ejecutando el script incluido:

Para compilar todos los componentes del parser y las clases auxiliares, ejecuta desde la raíz del proyecto:
Bash
```shell
sh install.sh
```

O si prefieres la instalación manual:

```shell
javac *.java
# Mueve el binario al PATH
sudo cp turing /usr/local/bin/

# Instala las paginas del manual
sudo cp turing.1.gz /usr/share/man/man1/
sudo mandb
```

## Ejecución

Puedes ejecutar el compilador de dos formas:
Para ejecutar el compilador ejecuta el siguiente comando:

Modo Archivo (Recomendado):
```shell
java TuringParser mi_archivo.mt
turing MiArchivo.mt -o maquina.out
```

Modo Consola (Interactivo):
> Puedes ver los parámetros del compilador de la siguiente manera:
> ```shell
> turing -h
> ```

## Ejecutando el binario

El binario acepta un archivo de texto con la cinta inicial.
También puedes definir un límite máximo de pasos para evitar ciclos infinitos (por defecto son 100).

```shell
java TuringParser
./maquina.out cinta.txt [limite_pasos]
```
>(Presiona Ctrl+D o Ctrl+Z al finalizar para procesar la entrada).

## 📝 Overview de Sintaxis

El lenguaje se divide en tres secciones principales:

- Declaración: machine NombreMaquina:
- Configuración: Bloque config { ... } donde se definen estados, alfabeto, estado inicial y símbolo blanco.
- Transiciones: Bloques state -> on { ... }; que definen el comportamiento de la máquina.
> Declaración
> ```
> machine NombreMaquina:
> end
> ```
>
> Definición
> ```
> config {
> states: [q0, q1, q_final],
> symbols: [0, 1, X, B],
> start: q0,
> blank: B,
> finals: [q_final]
> }
> ```
>
> Transiciones
> ```
> state q0 ->
> on 0: {
> write: 1,
> move: R,
> next: q1
> }
> ;
> ```

## 📂 Programas de Ejemplo

En la carpeta del repositorio encontrarás tres archivos clave para probar el compilador:
En la carpeta `examples/` encontrarás cuatro archivos `.mt` y sus cintas para probar el compilador:

- DuplicarUnos.mt
- ComplementoUno.mt
- Palindromo.mt
- Errores.mt

### El caso de Errores.mt
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
52 changes: 52 additions & 0 deletions examples/Palindromos.mt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
machine Palindromos:
config {
states: [q0, q1, q2, q3, q4, q5, q6, a],
symbols: [0, 1, X, B],
start: q0,
blank: B,
finals: [a]
}

state q0 ->
on 0: { write: X, move: R, next: q1 }
on 1: { write: X, move: R, next: q4 }
on X: { write: X, move: S, next: a }
on B: { write: B, move: S, next: a }
;

state q1 ->
on 0: { write: 0, move: R, next: q1 }
on 1: { write: 1, move: R, next: q1 }
on X: { write: X, move: L, next: q2 }
on B: { write: B, move: L, next: q2 }
;

state q2 ->
on 0: { write: X, move: L, next: q3 }
on X: { write: X, move: L, next: a }
;

state q3 ->
on 0: { write: 0, move: L, next: q3 }
on 1: { write: 1, move: L, next: q3 }
on X: { write: X, move: R, next: q0 }
;

state q4 ->
on 0: { write: 0, move: R, next: q4 }
on 1: { write: 1, move: R, next: q4 }
on X: { write: X, move: L, next: q5 }
on B: { write: B, move: L, next: q5 }
;

state q5 ->
on 1: { write: X, move: L, next: q6 }
on X: { write: X, move: L, next: a }
;

state q6 ->
on 0: { write: 0, move: L, next: q6 }
on 1: { write: 1, move: L, next: q6 }
on X: { write: X, move: R, next: q0 }
;
end
4 changes: 4 additions & 0 deletions examples/complemento.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
10110
01101
11001
10010
7 changes: 7 additions & 0 deletions examples/dup.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
11
111

11111
1111
1
0
11 changes: 11 additions & 0 deletions examples/pal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
1
11
1001
11011011
0101010
101001
01
011
0101
001
100
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loading