Proceso de traducción
Tags: teoriadelacomputacion, computerscience
Published: 2020-06-22 00:49:29

---
title: Proceso de traducción
published: true
description: 
tags: teoriadelacomputacion, computerscience
//cover_image: https://direct_url_to_image.jpg
---
Me encanta dejar el tema que me gusto en el día y con el que escucho mientras voy escribiendo, así que hoy les dejo:

{% spotify spotify:track:3pm4XtcsRIFFtH2UErk62R %}

![Proceso de traducción](https://dev-to-uploads.s3.amazonaws.com/i/gjabqbmlc50wbj61cbnv.png)

# Analizador léxico 🚩
Es genial empezar por entender que significa *léxico* para poder entender que hace este analizador léxico. Así que busque por [Internet](https://definicion.de/lexico/) y dice:
> Léxico es el **vocabulario** de un idioma o de una región, el **diccionario** de una lengua.

Bien esto esto ya empieza a tener sentido, *léxico de un idioma*, es decir, el idioma en nuestro área se traduce a **lenguaje de programación**. Un programa o un código fuente esta escrito mediante un lenguaje de este tipo, para luego el cual después de un proceso de traducción una computadora pueda entender y ejecutar estas instrucciones, pero tranquilos, estamos en el primer paso del proceso, falta para eso.

Entonces podemos decir:
> El **analizador léxico** es la primera fase de un compilador, consiste en un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de **tokens** (componentes léxicos) o símbolos.

Buenísimo el concepto! Lo saque de [Wikipedia](https://es.wikipedia.org/wiki/Analizador_l%C3%A9xico#:~:text=Un%20analizador%20l%C3%A9xico%20o%20analizador,(componentes%20l%C3%A9xicos)%20o%20s%C3%ADmbolos.) por si quieren leer mas.

Estos tokens sirven para el posterior fase del proceso de traducción, siendo la entrada para el *analizador sintáctico*.
Los **tokens** del lenguaje de programación consisten en:
- Palabras reservadas
- Literales o constantes
- Símbolos especiales
- Identificadores

## Como lo hace?
Buenísimo el concepto, todo lindo todo lindo, pero, COMO FUNCIONA CAPO?

Saber como funciona es clave para la construcción de un analizador léxico, por eso, tenemos que saber los siguiente:

> La *especificación de un lenguaje de programación* a menudo incluye un conjunto de *reglas* que definen el léxico. Estas reglas consiste comúnmente en **expresiones regulares** que indican un conjunto de posibles secuencias de caracteres que definen un token.

[Made in Wikipedia](https://es.wikipedia.org/wiki/Analizador_l%C3%A9xico) papa! Si, hay que saber de expresiones regulares para poder hacer un analizador léxico.

Si bien no te dije exactamente como funciona, te doy lo que esta involucrado en ese funcionamiento. Al momento que lees el post, yo me encuentro haciendo este apunte, próximo aplicar luego todo el conocimiento en una practica, así que estoy en deuda en eso para cuando sepa aplicarlo.

## Mecanismos
Hay tres mecanismos básicos para construir un
analizador lexicográfico:
- Ad hoc
- Mediante la implementación manual de los
[autómatas finitos](https://es.wikipedia.org/wiki/Aut%C3%B3mata_finito#:~:text=Un%20aut%C3%B3mata%20finito%20(AF)%20o,un%20conjunto%20de%20estados%20finales.)
- Mediante un [metacompilador](http://cogeeldineroycorre.blogspot.com/2007/05/metacompiladores.html#:~:text=Un%20metacompilador%20es%20un%20compilador,reconoce%20cualquier%20sentencia%20del%20lenguaje.)

# Analizador sintáctico 🚩
Como hicimos con la palabra *léxico* antes, vamos a entender la palabra *sintáctico*, o mas bien, [sintaxis](https://definicion.de/sintaxis/):
> La **sintaxis** se entiende como el grupo de normas que marcan las secuencias correctas de los elementos propios de un lenguaje de programación.

En otras palabras, podemos pensar que hacer una análisis de sintaxis es "ordenar" los elementos propios de un lenguaje, llámese tokens en nuestro caso, de alguna forma correcta, es decir, según ciertas normas o *reglas*. 

Si le queremos dar una vuelta mas de rosca al concepto, buscamos formar una **estructura** con todos estos tokens que recibimos siguiendo unas ciertas reglas para poder formar esta estructura, que por cierto tiene forma de **árbol** 🌳.

![Analizador Sintáctico](https://dev-to-uploads.s3.amazonaws.com/i/wwgag2tzmcread65zlag.png)

Bien, vamos bien estamos bien!
{% spotify spotify:track:2OWVCFTolecLiGZPquvWvT %}

En paso tenemos los tokens y queremos llegar al árbol 🌳. Pero debemos antes pasar las **REGLAS**!. Las reglas son la cosa mas inentendible que podrás ver al principio, pero cuando las entendes sos vos! Así que te voy a explicar como se leen y aplican estas reglas. Estas reglas son la que de alguna forma van a ir ordenando los tokens en una estructura de árbol, la primera pregunta que podemos hacer es,como escribimos estas reglas? Podemos usar otra otra palabra un poco mas formal para la ocasión, el lugar de escribir, digamos **especificar**, bien! Tiene que haber una forma de especificar estas reglas, pues si! Se llama **Gramática libre de contexto**.

## Gramática de libre contexto
Gramática de libre contexto? Si yo también me pregunte lo mismo, en que momento pasamos de estudiar informática a lengua. Pero todo tiene su explicación, y acá desde mi punto de vista personal te doy la mía. Estamos estudiando el proceso de traducción de un **lenguaje de programación**, como tal, seria un [lenguaje](https://es.wikipedia.org/wiki/Lenguaje), pero uno [formal](https://es.wikipedia.org/wiki/Lenguaje_formal#Especificaci%C3%B3n_de_lenguajes_formales), en la cual estos para su construcción se definen un conjunto de reglas gramaticales que pueden ser de [libre contexto](https://es.wikipedia.org/wiki/Gram%C3%A1tica_libre_de_contexto#:~:text=En%20ling%C3%BC%C3%ADstica%20e%20inform%C3%A1tica%2C%20una,terminales%20y%2Fo%20no%20terminales.).

Por si no fue suficiente mi explicación, deje los links de cada tema. Pero en fin, la idea no es estudiar lengua, la idea acá es conocer como se especifican esas reglas.

![Especificación de reglas](https://dev-to-uploads.s3.amazonaws.com/i/h0i8kh7f3iiapkk23y5e.png)

Como se ve en la imagen, hay una etiquetas que representan conceptos, es lo que voy a explicar ahora desde mis palabras:

- **No terminal**: La primera parte (la izquierda a la flecha) encontramos el no terminal, que básicamente, es como una variable con identificador, es decir, su nombre involucra lo que hay a la derecha de la flecha cuando se lo invoca. También se lo ve a la derecha, este puede ser otra regla o la misma, ya que estas reglas pueden ser **recursivas**, su nombre deberíamos reemplazar con su correspondiente "parte derecha".
- **Terminal**: El terminal es básicamente el token o un valor.
- **Producción**: Una producción es cada regla gramatical.

Ahora te estarás preguntando por que se llaman terminales y no terminales. En pocas palabras, eso es porque justamente al no terminal lo debemos reemplazar por su parte derecha, hasta que nos queden solo terminales y no podamos ir haciendo reemplazos (por eso se llaman terminales, porque la terminan), este proceso de ir reemplazando se llama **Derivaciones**.

Pero antes de hablar de derivaciones, terminemos esto con unos conceptos mas. Cuando armemos reglas o producciones, existen unos símbolos especiales.

![Símbolos de las reglas](https://dev-to-uploads.s3.amazonaws.com/i/cfzixtj6yy0r89hgc2f1.png)

Y por ultimo las producciones se pueden escribir de otra manera, utilizando la [notación de Backus-Naur](https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_Backus-Naur) (BNF). BNF es un sistema de reglas de derivación, escrito como:
```
<simbolo> ::= <expresión con símbolos>
```
## Derivaciones
![Continuara](https://cdn.pixabay.com/photo/2015/06/17/10/25/curtain-812223_960_720.jpg)