Skip to content

g-- é um compilador escrito em Prolog para a linguagem c--, um subset da linguagem c++ destinado a propósitos acadêmicos.

Notifications You must be signed in to change notification settings

gitbmvb/g--

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

g--, um compilador para a linguagem C--

"C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off." ― Bjarne Stroustrup

Disciplina: FGA0210 - PARADIGMAS DE PROGRAMAÇÃO - T01
Número do Grupo: 02
Paradigma: Lógico

Alunos

Matrícula Aluno
21/1039288 Bruno Campos Ribeiro
21/1039297 Bruno Martins Valério Bomfim
20/2016462 Heitor Marques
21/1029352 Igor e Silva Penha
19/0057858 José Luís Ramos Teixeira
21/1029405 Leonardo Gonçalves Machado
20/2016767 Lucas Felipe Soares
20/0062379 Marcos Vinícius de Deus
20/2045268 Raquel T. Eucária Pereira da Costa
21/2002907 Zenilda Pedrosa Vieira

Sobre

g-- é o projeto de um possível compilador desenvolvido em Prolog para a linguagem fictícia C--, que representa um subconjunto simplificado da linguagem C. Criado com o objetivo de explorar conceitos fundamentais de compiladores, linguagens de programação e o paradigma lógico de programação, o g-- busca processar o código-fonte escrito em C--, verificando sua corretude léxica e sintática.

A Linguagem C--


Imagem 1: Logo do C--
Fonte: Bruno Martins, 2024.

C-- é projetada como um subset da linguagem C, contendo apenas os recursos essenciais da linguagem para facilitar o processo de análise e compilação. Algumas de suas características incluem:

  • Tipos de dados básicos: int, char, void, além de constantes como true e false.
  • Estruturas de controle: if, else, while, e return.
  • Declaração de variáveis: Permite declarações simples e inicializações.
  • Função principal: O ponto de entrada do programa é uma função main() obrigatória.
  • Expressões matemáticas: Suporte a operadores aritméticos (+, -, *, /, %) e relacionais (<, >, ==, etc.).

O C-- elimina recursos mais complexos do C, como funções e ponteiros, tornando a linguagem mais factível para o projeto da disciplina.

Estrutura do Compilador g--:

  1. Análise Léxica: O analisador léxico transforma o código-fonte em uma sequência de tokens, representando as menores unidades significativas da linguagem, como identificadores, números, operadores e palavras-chave.

  2. Análise Sintática: O analisador sintático utiliza um conjunto de regras gramaticais para verificar se a sequência de tokens forma estruturas válidas em C--. Essa etapa é implementada como um parser descendente recursivo em Prolog, utilizando predicados para cada produção da gramática.

Para uma leitura mais detalhada sobre os aspectos do compilador g--, acesse a nossa documentação na íntegra.

Screenshots



Imagem 2: Mensagem de boas-vindas do compilador
Fonte: Bruno Martins, 2024.




Imagem 3: Exemplo da execução do caso de teste 1, disponível na pasta "testes"
Fonte: Bruno Martins, Lucas Soares e Raquel Eucaria, 2024.




Imagem 4: Exemplo da execução do caso de teste 3, disponível na pasta "testes"
Fonte: Bruno Martins, Lucas Soares e Raquel Eucaria, 2024.


Instalação e Configuração do Ambiente

Siga os passos abaixo para configurar o ambiente e executar o programa:

  1. Instale o SWI-Prolog:
  • No Ubuntu/Debian:
    sudo apt-get update
    sudo apt-get install swi-prolog
  • No Windows ou macOS, baixe e instale a partir do site oficial do SWI-Prolog.
  1. Baixe o repositório do projeto g--:
  • Via ssh:
    git clone git@github.com:UnBParadigmas2024-2/2024.2_G2_Logico_CompiladorC--.git
  • Via https:
    git clone https://github.com/UnBParadigmas2024-2/2024.2_G2_Logico_CompiladorC--.git
  1. Navegue até a pasta raiz do repositório:

    cd 2024.2_G2_Logico_CompiladorC--/
  2. Verifique a instalação:

    Para verificar a integridade da instalação do seu compilador g--, execute o seguinte código descrito abaixo:

    swipl -s main.pl -g main

    É esperado que apareça na tela a seguinte mensagem:

    === g-- Versão 1.0.0 | 13 de dezembro de 2024 ===
    Autores: Bruno Ribeiro, Bruno Martins, Heitor Marques,
    Igor Penha, José Luís Teixeira, Leonardo Machado, Lucas Soares,
    Marcos de Deus, Raquel Eucária e Zenilda Vieira
    
    Seu compilador g-- foi instalado corretamente!
    Compile seu código c-- com "swipl -s main.pl -g main -- <filename>.cmm"

    Este processo é descrito visualmente abaixo, utilizando o clone ssh:



    Imagem 5: Processo de configuração do ambiente
    Fonte: Bruno Martins, 2024.

Uso

Para utilizar o compilador g--, é necessário que você crie um arquivo com extensão .cmm na pasta raiz do projeto, empregando corretamente expressões válidas da linguagem C--, por meio de qualquer editor de texto ou IDE de sua preferência. Em seguida, basta inserir no terminal o seguinte comando:

swipl -s main.pl -g main -- <nome-do-arquivo>.cmm

A título de exemplo, vamos criar o programa teste.cmm definido abaixo:

int main(void) {
	return 0;
}

Na sequência, bastaria executar no seu terminal:

swipl -s main.pl -g main -- teste.cmm

Vídeo

https://youtu.be/DpWAvbdxjz0

Participações

Nome do Membro Contribuição Significância da Contribuição (Excelente/Boa/Regular/Ruim/Nula) Comprobatórios (ex. links para commits)
Bruno Campos Ribeiro (1) Participação nas reuniões do grupo, definição e elicitação de requisitos para o projeto.
(2) Construção da gramática utilizada no projeto.
(3) Transcrição da gramática para código na análise sintática.
(4) Validação e Verificação do projeto de forma total, tanto análise léxica quanto sintática.
Excelente Commit 5e08b84
Commit 3b87c8c
Commit 24b1a6b
Commit 2ed4889
Commit f37905a
Commit c47c95e
Bruno Martins Valério Bomfim (1) Participação nas reuniões em grupo para definição do tema e demais requisitos do projeto.
(2) Análise sintática: revisão da gramática, transcrição das regras de produção para o Prolog, bug search nas expressões produzidas.
(3) Análise léxica: revisão do código e de pull requests.
(4) Verificação e Validação: geração de alguns casos de teste de código para testar a eficácia do compilador.
(5) Integração e organização: realização da integração das duas análises (léxica e sintática) e reorganização da estrutura do repositório.
(6) Documentação: produção do README, adição de comentários no código para facilitar o entendimento, correção de erros gramaticais nos textos, e produção do relato pessoal das atividades desenvolvidas (tópico "Outros").
(7) Participação da produção do vídeo da entrega.
Excelente (1) Disponível do teams de Paradigmas, no Microsoft Teams.
(2) Commit 125a5c5
(3) Commit 92beef1, Commit 1df6eec
(4) Commit f3b2d5a
(5) Commit 7461770, Commit 5a53465
(6) Commit f37905a, Commit 478e43c, Commit 412fdaf, Commit fe72166, Commit c3d9d24, Commit c22b26e
(7) Vídeo
Heitor Marques Participei da reunião inicial do grupo via Teams para definição do tema e requisitos do projeto. Testes iniciais com a criação de um analisador léxico com base na gramatica proposta para o c--, refatoração no código léxico com base no código base que havia criado e ajustes de erros no analisador léxico. Participação no video. Excelente Lista de Commits
Igor e Silva Penha (1) Participação nas reuniões do grupo, definição e elicitação de requisitos para o projeto.
(2) Construção da gramática utilizada no projeto.
(3) Transcrição da gramática para código na análise sintática.
(4) Revisão do código da análise sintática + correções.
(5) Validação + testes do projeto de forma total, tanto análise léxica quanto sintática.
Excelente (2) gramatica c--
(2)eliminação recursão
(3) analisador sintático
(3)analisador sintático
(4)/(5)fix analisador sintático + testes
José Luís Ramos Teixeira Participei da reunião inicial do grupo via Teams para definição do tema e requisitos do projeto. Contribuição significativa na construção e refatoração do analisador léxico, desde a organização dos arquivos até ajustes na base de tokens, seguindo a gramática do projeto. Participei também na documentação inicial do módulo léxico e no vídeo final em grupo. Excelente Léxico com arquivos organizados
Documentação inicial
Refatoração da base léxica
Ajuste no analisador léxico
Participação no vídeo
Leonardo Gonçalves Machado Participação na adaptação da gramática do analisador sintatico e implementação do código do analisador sintático. Participei também da integração entre os analisadores léxico e sintático. Excelente Implementação do analisador sintático
Compilador aceita arquivos corretos
Documentação
Lucas Felipe Soares Participação principalmente com a criação do analisador Léxico. Desde a geração da tabela de Tokens até a lógica em si. Participei revisando código e debug também. Criei o presente repositório e a iniciação da documentação que fora avançada por colegas. Excelente Analisador Léxico e organização dos arquivos
Base e criação de testes
Criação da Tabela de Tokens
Criação do template de documentação do projeto
Marcos Vinícius de Deus Participação mais ativa na criação do analisador Léxico. Principalmente na geração da tabela de tokens. Contribuí em alguns pontos da documentação também, como criação do documento de descrição do nosso projeto. Outro ponto que contribuí foi com a elaboração do roteiro do vídeo e edição do mesmo Boa Analisador léxico
Documentação
Roteiro do vídeo
Vídeo
Raquel T. Eucária Pereira da Costa Participação nas reuniões em grupo para definição do tema e demais requisitos do projeto.
Desenvolvimento do Analisador Sintático.
Ajustes na saída do sistema.
Documentação sobre o projeto e README.
Participação no vídeo e na edição dele.
Boa Gramática
Analisador
Ajuste saída
Documentação
README
Zenilda Pedrosa Vieira . Participação nas discussões em grupo para definição do tema e demais requisitos do projeto.
. Conversão do arquivo inicial em prolog de um compilador de Pascal simplificado codificado em Python por mim na disciplina de Compiladores (2024.01). Esse algoritmo foi utilizado como base inicial para o compilador g--.
. Análise léxica: revisão do código, inclusão de comentários para maior legibilidade do código e inclusão de mensagens.
. Análise Sintática: revisão do código, inclusão de mensagens de erro sintático e correção de loop infinito.
. Alguns testes de código para verificar o compilador.
. Documentação: adição do relato pessoal das atividades desenvolvidas (tópico "Outros").
. Participação no vídeo da entrega.
Boa . Testes em Pascal 1
. Testes em Pascal 2
. Inclusão de mensagens de erro quando o código não for aceito 1
. Inclusão de mensagens de erro quando o código não for aceito 2
. Melhora da legibilidade da saída da analise sintática
. Inclusão de comentários para melhorar legibilidade do código
. Documentação

Outros

Acesse o relato de cada membro do grupo referente às lições aprendidas, percepções, contribuições, fragilidades e trabalhos futuros através dos links abaixo:

Bibliografia

[1] AHO, Alfred V.; LAM, Monica S.; SETHI, Ravi; ULLMAN, Jeffrey D. Compilers: Principles, Techniques, and Tools. 2. ed. Boston: Pearson Addison Wesley, 2006.

[2] FREE SOFTWARE FOUNDATION. GNU Compiler Collection (GCC). Disponível em: link. Acesso em: 11 dez. 2024.

[3] WILDER, Michael. CS445 - Compiler Design. University of Idaho. Disponível em: link. Acesso em: 4 dez. 2024.

[4] COSTA JÚNIOR, Edson Alves da. Repositório da Disciplina de Compiladores 1. Faculdade de Ciências e Tecnologias em Engenharia (FCTE) – Campus Gama, Universidade de Brasília (UnB). Disponível em: link. Acesso em: 10 dez. 2024.

[5] RIBAS, Bruno César. Materiais da Disciplina de Compiladores 1. Faculdade de Ciências e Tecnologias em Engenharia (FCTE) – Campus Gama, Universidade de Brasília (UnB). Disponível em: link. Acesso em: 10 dez. 2024.

[6] SERRANO, Milene. Materiais da Disciplina de Paradigmas de Programação. Faculdade de Ciências e Tecnologias em Engenharia (FCTE) – Campus Gama, Universidade de Brasília (UnB). Disponível em: link. Acesso em: 10 dez. 2024.

[7] SANTIAGO, Judson. Repositório da Disciplina de Compiladores. Universidade Federal Rural do Semi-Árido (UFERSA). Disponível em: link. Acesso em: 10 dez. 2024.

[8] WIKIPEDIA. Backus–Naur Form. Disponível em: link. Acesso em: 10 dez. 2024.

About

g-- é um compilador escrito em Prolog para a linguagem c--, um subset da linguagem c++ destinado a propósitos acadêmicos.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Prolog 100.0%