FUNDAMENTALS - CONCEITO DE INTERPRETAÇÃO
Tags: computerscience, programming, beginners, elixir
Published: 2023-05-12 22:58:18

Eu tive a grata e, ao mesmo tempo, a infelicidade de tentar escrever meu próprio JSON Parser(converte dados de tipo JSON em estruturas equivalentes para sua linguagem de programação e vice-versa) utilizando Elixir. Então, isso despertou a vontade de entender mais sobre o assunto e discorrer de forma simples o conceito de interpretação.


Muitas linguagens de programação são interpretadas (php, python) ou compiladas (C/C++, Erlang), ou uma mistura dos dois (Java, Kotlin, C#), mas isso não é uma lei já que dá pra compilar código fonte python, então já dá para notar que o buraco é mais embaixo. Mas no geral esses processos de interpretação/compilação passam por etapas essenciais muito parecidas.

## Analise de Léxico

Levando em consideração o JSON Parser, primeiro teremos a etapa de análise de léxico ou tokenização, basicamente consiste em receber um código fonte, como um JSON:

```json
	{“I choose love” : “s2”}
```


percorrer o código e dividi-lo em pequenas partes chamadas de tokens, fazendo uma lista, tal qual:

```json
	[“{”, “I”, ”choose”, “love”, “:”, “s2”, “}”]
```

Nesta fase não há nenhum tipo de validação se esses tokens são realmente válidos, ou seja, eles não têm valor algum. 

Fazendo um paralelo, poderíamos pegar uma sentença, como “Eu escolho o amor” e dividi-la por palavras `[“Eu”, “escolho”, “o”, “amor”]`, essas palavras não tem uma função ou valor; claro, algumas são pronomes, verbos e substantivos, mas qual a função/valor delas em uma sentença/oração ?

## Analise Sintática

Pensando em valor/função é que passamos para nossa segunda etapa, análise sintática ou parsing (analisar), onde basicamente irá, de acordo com um conjunto de regras preestabelecidas, dar valor/função a cada um desses tokens e validá-los. Exemplo, todo texto JSON começa com chaves `{` e termina com `}` e deve haver no mínimo uma key, com aspas duplas envolvendo-as, dois pontos `:` para identificar a atribuição de valor e um valor qualquer. Então nossos tokens são validos.

Voltando ao exemplo da nossa sentença “Eu escolho o amor”, também podemos realizar a análise sintática dessas palavras, ou seja, descobrir a função que cada uma dessas partes desempenha em nossa sentença, como: `“Eu” = Sujeito [“escolho”, “o”, “amor”] = Predicado`. Claro, estamos fazendo essa análise devido a regras pré-definidas. 

Mas e se eu tiver um JSON com mais camadas ? Exemplo:
```json
{
   "MyLoves":{
      "programming": "I hate u I luv u",
      "Diana": "my unique luv"
   }
}
```
Neste caso você terá que realizar as verificações que já são feitas so que de forma recursiva, levando em conta o ponto de partida (camada mais alta) do JSON `{` e o ponto de termino (camada mais baixa) `}`.

Este artigo foi so a pontinha do iceberg, contudo há muito conteúdo se aprofundando nessas aguas misteriosas e estarei deixando alguns aqui embaixo:

- [Crafting Interpreters](https://craftinginterpreters.com/)
- [Compiladores: Princípios, Técnicas e Ferramentas](https://www.amazon.com.br/Compiladores-princ%C3%ADpios-ferramentas-Alfred-Aho/dp/8588639246/ref=asc_df_8588639246/?tag=googleshopp00-20&linkCode=df0&hvadid=379792581512&hvpos=&hvnetw=g&hvrand=13539101328651479700&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1031632&hvtargid=pla-810094896642&psc=1)
- [Writing a C Compiler](Writing a C Compiler, Part 1)