Executando verificação de segurança...
4

[My notes] Compiladores - Parsing

Aviso!

Este post é uma parte das minhas anotações pessoais sobre compiladores, ou seja ainda não cobre todos os fundamentos, creio que farei outros posts com outras anotações sobre as outras etapas de compilação.

Bom, está area é gigantesca e seria impossível aprender tudo de uma vez, mais creio que consiga aprender os fundamentos pelo menos :D.

Introdução

Compiladores são sofwares cujo o único objeto é transformar uma estrutura gramatical(ou linguagem) em outra linguagem. Muito além disto podemos observar que eles são transformadores e otimizadores, eles corrigem muita coisa errada que fazemos.

Partes

Bom, compiladores são divíduos em algumas partes, sendo elas:

  • Parsing
  • Transformation
  • Code generation

Parsing

Está fase da compilação é responsável em pegar nosso código de entrada, e transforma-lo em uma estrutura organizada, conhecida como AST(Abstract Syntax Tree), resumidamente pelo que entendi seria uma visão simplificada do que foi escrito em formato de arvore.

Exemplo de AST

O parsing tem 2 fases, sendo elas:

  • Analise léxica
  • Analise sintática

Analise léxica

Bom a analise léxica separa o código "puro" em partes, e estas partes serão chamadas comumente de tokens que podem ser classificados como pontuações, números, operadores e etc. essa separação geralmente é feita por algo que pode ser chamado de tokenizer, chamaria ele de classificador por ele classificar textos sem significado, contudo por convenção é utilizado tokenizer.

Exemplo de tokenizer: https://github.com/lydell/js-tokens

Analise sintática

Feita a analise léxica a analise sintática traz mais significados a esses tokens perdidos estabelecendo relações entre eles.

Exemplo

Para uma sintaxe como está:

print('Hello World')

imagino que teríamos tokens parecidos com isto:

[
    { type: 'name', value: 'print' },
    { type: 'paren': value: '(' },
    { type: 'text', value: 'Hello World' }
    { type: 'paren': value: ')' },
]

obs: Penso eu que de para separar melhor, contudo não consegui pensar em nada no momento :P.

Imaginei uma AST para estes tokens e pensei nisto:

{
    body: [
        {
            type: 'CallFunction',
            name: 'print',
            params: [
                {
                    type: 'String',
                    value: 'Hello World'
                }
            ]
        }
    ]
}

obs: este daqui está extremamente simplificado poderíamos discutir muito de como a essa string poderia ser representada, mais por agora creio que esteja ótimo, porém caso queira o python tem uma biblioteca chamada ast, que como o proprio nome diz consegue fazer ASTS utilizando a gramatica da linguagem

Bom, após estes estudos tentei aplicar os conceitos apreendidos(principalmente a tokenização) em um projeto de uma biblioteca que transforma rotas em texto em regex, segue o código: https://gitlab.com/diegogitlab03/path-to-regexp

Carregando publicação patrocinada...
2

Pô cara que conteudo bacana! É dificil achar material de compiladores/interpretadores/transpiladores em pt-br. Toda e qualquer informação sobre o tema ajuda bastante aos que se interessam pela arte de transformar codigo em codigo!

1

Gosto quando alguém posta algo assim. É necessário entender essas coisas, mesmo que ela não tenha utilidade direta para a maioria das pessoas. Faz uma diferença enorme e só quem aprende, consegue pereber isso. Fica a dica para todo mundo começar ver um pouco além da superfície, isso vai impactar no trabalho diário de forma que a pessoa nem imagina.

Para não ficar só em um comentário bobo de congratulação, eu dei uma resposta com um conteúdo um pouco mais amplo, mas não muito técnico, pra leigo mesmo, e acho que complementa o que está aqui (que é muito bom por sinal), para quem quer continuar no tema.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).