Criando a base do Compilador
Introduzindo a base do nosso Compilador
O que veremos nesta aula
Leitura do arquivo fonte
Criação da classe do Compilador
Criação da classe do Token
Definindo objetivos
Nesta primeira aula iremos começar a fazer os primeiros componentes do nosso Compilador, e fazer lógica básica que irá compor o nosso programa como um todo. Aqui nós teremos três responsabilidades que precisam ser tratadas nesta aula, que no caso seria, pegar as linhas do nosso arquivo fonte, a classe do Compilador e a classe to Token.
Extraindo o texto do arquivo fonte
Primeiramente antes de começar o processo de Compilação, nós iremos precisar de pegar o nosso arquivo fonte, para o meu caso decidi ela será extraído fazendo leitura de arquivo, usando as bibliotecas leitura de arquivo em C++.
Se colocarmos o nosso programa de exemplo main.x
aqui, ele irá imprimir todas as linhas do nosso programa:
Perfeito, e assim a nossa primeira responsabilidade está feita, podemos passar para a segunda, que é criar a classe do Compilador
Classe do Compilador
Se você se lembra da aula introdutória a disciplina, você deve se lembrar desse diagrama aqui, que utilizei para ilustrar como é um Compilador:
Fonte: https://refactoring.guru/pt-br/design-patterns/facade
E como pode-se perceber essa definição é exatamente o que o nosso compilador é: um conjunto de classes que expressão um comportamento complexo, que no nosso caso é transformar um programa fonte, em código que a máquina possa compreender. Caso ainda não tenha ficado muito claro isso, não se preocupe, nós iremos desenvolver a aplicação juntos e isso ajudará a trazer mais clareza em como esse padrão de projeto funciona.
Além disso, como não temos ainda muito dos componentes que será o nosso Facade, então iremos apenas deixar em grande parte a ideia, e depois iremos adicionando os elementos um por um a medida que eles forem realmente feitos.
Sem mais interrupções, vamos então criar a nossa classe
Então essa é a ideia básica, uma classe onde todos os componentes do nosso Compilador se unem e temos a nossa funcao compile que irá pegar o vetor de linhas (programa fonte) e irá retornar um boolean se por acaso o processo de compilação foi um sucesso ou não. Por fim, vamos instanciar a nossa classe compilador na main.
Como dito anteriormente, nos ainda não temos todos os componentes do nosso Compilador para fazer o nosso Facade, mas isso será mais do que o suficiente por agora, e ao longo do tempo iremos melhorar e adicionar os elementos que faltarem.
Classe do Token
Precisamos de uma classe que será responsável em guardar os dados dos tokens que serão lidos do programa fonte, por isso iremos criar essa classe chamada: Token. Além disso, precisamos entender quais são as informações que um Token pode ter:
Lexema - formato original do token no código fonte
Tipo - define o tipo de dado (data type) (ex: inteiro, float, boolean)
Classe - define como o token foi inicializado (ex: variável, constante)
Tamanho - o tamanho que esse token irá ocupar em memória (isso será importante quando implementarmos o código em assembly)
Endereço - o endereço onde o token será armazenado em memória (isso será importante quando implementarmos o código em assembly)
Com essas informações em mente, vamos então dar uma olhada
Last updated