"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
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 |
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.
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 comotrue
efalse
. - Estruturas de controle:
if
,else
,while
, ereturn
. - 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.
-
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.
-
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.

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.
Siga os passos abaixo para configurar o ambiente e executar o programa:
- 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.
- 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
-
Navegue até a pasta raiz do repositório:
cd 2024.2_G2_Logico_CompiladorC--/
-
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:
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
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 |
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:
- Bruno Campos Ribeiro
- Bruno Martins Valério Bomfim
- Heitor Marques
- Igor e Silva Penha
- José Luís Ramos Teixeira
- Leonardo Gonçalves Machado
- Lucas Felipe Soares
- Marcos Vinícius de Deus
- Raquel T. Eucária Pereira da Costa
- Zenilda Pedrosa Vieira
[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.