Skip to content

Commit 6a57835

Browse files
Merge pull request #2 from marcelomamorim/codex/create-initial-documentation-for-readme.md-6mp3h8
docs: add wl-copy example for raw README
2 parents b394208 + 83b0e82 commit 6a57835

File tree

1 file changed

+265
-33
lines changed

1 file changed

+265
-33
lines changed

README.md

Lines changed: 265 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,284 @@
44
[![GitHub issues](https://img.shields.io/github/issues/UnBCIC-TP2/r-python)](https://github.com/UnBCIC-TP2/r-python/issues)
55
[![CI Status](https://img.shields.io/github/actions/workflow/status/UnBCIC-TP2/r-python/ci.yml?branch=main&label=ci-status&color=blue)](https://github.com/UnBCIC-TP2/r-python/actions)
66

7+
Um compilador/interpretador experimental escrito em Rust para uma linguagem com sintaxe inspirada no Python, mas com regras explícitas de tipagem estática e blocos delimitados por `end`. O projeto nasceu como ferramenta acadêmica para explorar conceitos de construção de compiladores e interpretação de linguagens.
78

8-
Um compilador experimental implementado em Rust que interpreta uma linguagem com sintaxe similar ao Python. Este projeto foi desenvolvido como ferramenta de aprendizado para conceitos de técnicas de programação.
9+
> 🔎 Precisa copiar o README inteiro? A versão crua está disponível em `README.md`, bastando abrir o arquivo em modo *Raw* no GitHub ou executar `cat README.md` após clonar o repositório.
910
10-
## 📋 Sobre o Projeto
11+
## 🧭 Índice
1112

12-
RPython é um projeto educacional que visa:
13-
- Implementar um compilador funcional em Rust
14-
- Explorar conceitos fundamentais de técnicas de programação
15-
- Criar uma linguagem com sintaxe amigável similar ao Python
13+
- [Visão Geral](#-visão-geral)
14+
- [Arquitetura em Alto Nível](#-arquitetura-em-alto-nível)
15+
- [Catálogo de Features da Linguagem](#-catálogo-de-features-da-linguagem)
16+
- [Literais e Operações Numéricas](#literais-e-operações-numéricas)
17+
- [Lógica Booleana e Comparações](#lógica-booleana-e-comparações)
18+
- [Listas e Tuplas](#listas-e-tuplas)
19+
- [Declarações `val`/`var` e Atribuições](#declarações-valvar-e-atribuições)
20+
- [Controle de Fluxo (`if`/`elif`/`else`, `while`, `for`)](#controle-de-fluxo-ifelifelse-while-for)
21+
- [Funções Tipadas, Retorno e Recursão](#funções-tipadas-retorno-e-recursão)
22+
- [Assertions em Tempo de Execução](#assertions-em-tempo-de-execução)
23+
- [Blocos de Teste Automatizado](#blocos-de-teste-automatizado)
24+
- [Valores `Result` e Propagação de Erros](#valores-result-e-propagação-de-erros)
25+
- [Valores `Maybe` (Opcionais)](#valores-maybe-opcionais)
26+
- [Construtores de Tipos Algébricos (ADT)](#construtores-de-tipos-algébricos-adt)
27+
- [Guia Rápido](#-guia-rápido)
28+
- [Documentação Complementar](#-documentação-complementar)
29+
- [Contribuindo](#-contribuindo)
1630

17-
## 📚 Documentação
31+
## 📋 Visão Geral
1832

19-
Para uma compreensão mais profunda dos componentes do projeto, consulte nossa documentação técnica:
33+
RPython tem como foco:
2034

21-
- **[Environment Module](docs/environment.md)** - Sistema de gerenciamento de escopo lexical com tabela de símbolos para variáveis e funções. Implementa uma pilha de escopos com resolução adequada da cadeia de escopo.
35+
- **Aprendizado de compiladores:** o código-fonte serve como laboratório para parsing, análise semântica, verificação de tipos e interpretação.
36+
- **Linguagem familiar:** a sintaxe lembra Python, mas inclui recursos clássicos de linguagens fortemente tipadas (anotações obrigatórias em funções, declarações `var`/`val`, ADTs em desenvolvimento).
37+
- **Ferramentas modernas:** todo o pipeline é escrito em Rust, aproveitando segurança de memória e uma rica base de testes automatizados.
2238

23-
- **[Parser Component](docs/parser.md)** - Componente de análise sintática que transforma código fonte em Árvore de Sintaxe Abstrata (AST). Usa a biblioteca `nom` e segue um design modular com funcionalidades especializadas para expressões, tipos e declarações.
39+
## 🏗️ Arquitetura em Alto Nível
2440

25-
- **[Type Checker Module](docs/type_checker.md)** - Sistema de verificação de tipos estática que analisa expressões e declarações para garantir segurança de tipos em tempo de compilação. Implementa regras de tipagem bem definidas para todos os construtos da linguagem. *(Em desenvolvimento)*
41+
- **Parser (`src/parser`)** – Constrói a Árvore de Sintaxe Abstrata (AST) a partir do código-fonte utilizando `nom`.
42+
- **IR/AST (`src/ir`)** – Define as estruturas centrais da linguagem (expressões, declarações, tipos e construtores).
43+
- **Environment (`src/environment`)** – Implementa pilha de escopos para variáveis, funções e tipos.
44+
- **Type Checker (`src/type_checker`)** – Analisa programas para garantir consistência de tipos antes da execução. (Algumas funcionalidades avançadas ainda estão em desenvolvimento.)
45+
- **Interpreter (`src/interpreter`)** – Avalia a AST produzindo resultados de execução.
46+
- **Pretty Printer (`src/pretty_print`)** – Gera representações legíveis da AST, útil para debugging e tooling.
2647

48+
## 🧪 Catálogo de Features da Linguagem
2749

28-
## 🤝 Contribuindo
50+
Os módulos de AST, parser, verificação de tipos e interpretador já oferecem um conjunto sólido de recursos — de operações aritméticas a estruturas de controle, passando por coleções, funções tipadas e tratamento de erros. Consulte `src/ir/ast.rs` e `src/parser/parser_stmt.rs` para ver a implementação completa de cada construção apresentada abaixo. A seguir reunimos exemplos autoexplicativos para cada feature disponível hoje.
2951

30-
Adoraríamos contar com sua contribuição! Por favor, leia nossos guias de contribuição:
31-
- [Guia de Contribuição em Português](CONTRIBUTING_pt.md)
32-
- [Contributing Guidelines in English](CONTRIBUTING_en.md)
52+
### Literais e Operações Numéricas
53+
54+
```text
55+
val inteiro = 42;
56+
val real = 3.14;
57+
58+
val soma = inteiro + 8;
59+
val mix = real * 2.0 - inteiro;
60+
val divisao = inteiro / 2;
61+
```
62+
63+
<!-- -->
64+
65+
### Lógica Booleana e Comparações
66+
67+
```text
68+
val idade = 20;
69+
val possui_autorizacao = False;
70+
71+
val maior_de_idade = idade >= 18;
72+
val pode_participar = maior_de_idade or possui_autorizacao;
73+
val precisa_aviso = not maior_de_idade and possui_autorizacao == False;
74+
```
75+
76+
### Listas e Tuplas
77+
78+
```text
79+
val lista_vazia = [];
80+
val linguagens = ["RPython", "Rust", "Python"];
81+
val pares = [(1, "um"), (2, "dois")];
82+
val coordenada = (latitude, longitude, "Norte");
83+
```
84+
85+
> ℹ️ Listas e tuplas aparecem como `ListValue` e `Tuple` na AST, garantindo suporte a coleções homogêneas e heterogêneas (veja `src/ir/ast.rs`).
86+
87+
### Declarações `val`/`var` e Atribuições
88+
89+
```text
90+
val nome = "RPython"; # imutável
91+
var contador = 0; # mutável
92+
93+
contador = contador + 1;
94+
val saudacao = "Olá, " + nome;
95+
```
96+
97+
> ℹ️ Declarações `val`/`var` e reatribuições são modeladas por `Statement::ValDeclaration`, `Statement::VarDeclaration` e `Statement::Assignment` em `src/ir/ast.rs`.
98+
99+
### Controle de Fluxo (`if`/`elif`/`else`, `while`, `for`)
100+
101+
```text
102+
if nota >= 9:
103+
conceito = "Excelente";
104+
elif nota >= 7:
105+
conceito = "Bom";
106+
else:
107+
conceito = "Recuperação";
108+
end
109+
110+
var total = 0;
111+
while total < 3:
112+
total = total + 1;
113+
end
114+
115+
val numeros = [1, 2, 3];
116+
var soma = 0;
117+
for n in numeros:
118+
soma = soma + n;
119+
end
120+
```
121+
122+
> ℹ️ O núcleo reconhece `if`/`elif`/`else`, laços `while` e `for` como variantes específicas da AST, preservando o bloco associado a cada controle de fluxo (implementações em `src/ir/ast.rs` e `src/parser/parser_stmt.rs`).
123+
124+
### Funções Tipadas, Retorno e Recursão
125+
126+
```text
127+
def fibonacci(n: Int) -> Int:
128+
if n <= 1:
129+
return n;
130+
end
131+
return fibonacci(n - 1) + fibonacci(n - 2);
132+
end;
133+
134+
val resultado = fibonacci(10);
135+
asserttrue(resultado == 55, "Fib(10) deve ser 55");
136+
```
137+
138+
> ℹ️ Funções são representadas por `Function` + `Statement::FuncDef`, com anotações obrigatórias de tipos de parâmetros e retorno (`src/ir/ast.rs` e `src/parser/parser_stmt.rs`).
139+
140+
### Assertions em Tempo de Execução
141+
142+
```text
143+
asserttrue(condicao, "Mensagem de sucesso");
144+
assertfalse(condicao, "Mensagem de erro");
145+
asserteq(resultado, esperado, "Valores devem ser iguais");
146+
assertneq(id_atual, ultimo_id, "IDs não podem coincidir");
147+
```
148+
149+
> ℹ️ Há variantes dedicadas para cada assertiva (`Assert`, `AssertTrue`, `AssertFalse`, `AssertEQ`, `AssertNEQ`) que permitem mensagens customizadas e integração com o runner de testes (detalhes em `src/ir/ast.rs`).
150+
151+
### Blocos de Teste Automatizado
152+
153+
```text
154+
test soma_basica():
155+
val resultado = 2 + 3;
156+
asserttrue(resultado == 5, "2 + 3 deve ser 5");
157+
end
158+
```
159+
160+
> ℹ️ O interpretador expõe `Statement::TestDef` para registrar casos de teste e executá-los isoladamente com coleta de resultados (veja `src/ir/ast.rs` e `src/interpreter/statement_execute.rs`).
161+
162+
### Valores `Result` e Propagação de Erros
163+
164+
```text
165+
def dividir(a: Int, b: Int) -> Result[Int, String]:
166+
if b == 0:
167+
return Err("Divisão por zero");
168+
end
169+
return Ok(a / b);
170+
end;
171+
172+
def dividir_e_incrementar(a: Int, b: Int, inc: Int) -> Result[Int, String]:
173+
val quociente = dividir(a, b)?; # Propaga Err automaticamente
174+
return Ok(quociente + inc);
175+
end;
176+
177+
val resultado = dividir_e_incrementar(10, 2, 1);
178+
assertfalse(is_error(resultado), "Esperávamos um Ok");
179+
```
180+
181+
> ℹ️ Resultado de erros utiliza as variantes `COk`, `CErr`, `Propagate`, `IsError` e `Unwrap` dentro da AST e do interpretador, cobrindo desde a construção até a propagação de falhas (`src/ir/ast.rs` e `src/interpreter/expression_eval.rs`).
182+
183+
### Valores `Maybe` (Opcionais)
33184

34-
## 🚀 Começando
185+
```text
186+
val nome = Just("RPython");
187+
188+
if is_nothing(nome):
189+
assertfalse(True, "Nome não deveria ser Nothing");
190+
end
191+
192+
val texto = nome!; # unwrap: lança erro se for Nothing
193+
```
194+
195+
> ℹ️ Valores opcionais contam com `CJust`, `CNothing`, `IsNothing` e `Unwrap`, permitindo presença ou ausência de dados com verificação estática (consulte `src/ir/ast.rs` e `src/type_checker/expression_type_checker.rs`).
196+
197+
### Construtores de Tipos Algébricos (ADT)
198+
199+
```text
200+
data Forma:
201+
| Circulo Int
202+
| Retangulo Int Int
203+
end
204+
205+
val figura = Circulo(5);
206+
```
207+
208+
> ℹ️ Tipos algébricos são descritos por `Type::TAlgebraicData` e `ValueConstructor`, habilitando construtores nomeados com múltiplos campos (`src/ir/ast.rs`).
209+
210+
> 💡 A sintaxe usa `;` para separar instruções dentro de blocos e a palavra-chave `end` para finalizar estruturas de controle e definições.
211+
212+
## ⚙️ Guia Rápido
35213

36214
### Pré-requisitos
37215

38216
- Rust (última versão estável)
39-
- Cargo (gerenciador de pacotes do Rust)
40-
- Git (para clonar o repositório)
41-
- Editor de texto ou IDE de sua preferência
42-
43-
### Configuração do Ambiente
44-
45-
1. Primeiro, instale o Rust e Cargo usando rustup:
46-
- Windows:
47-
- Baixe e execute rustup-init.exe em https://rustup.rs
48-
- Siga as instruções do instalador
49-
- Linux/macOS:
50-
- Abra o terminal e execute:
51-
```bash
52-
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
53-
```
54-
- Siga as instruções do instalador
55-
- Reinicie seu terminal após a instalação
217+
- Cargo (já incluído na instalação padrão do Rust)
218+
- Git
219+
220+
### Clonando o repositório
221+
222+
```bash
223+
git clone https://github.com/UnBCIC-TP2/r-python.git
224+
cd r-python
225+
```
226+
227+
### Compilação e testes
228+
229+
```bash
230+
# Compilar o projeto
231+
cargo build
232+
233+
# Executar a suíte de testes
234+
cargo test
235+
```
236+
237+
### Executando exemplos
238+
239+
Você pode experimentar trechos da linguagem utilizando `cargo test -- --nocapture` para observar os programas de exemplo instrumentados no `main`. Em breve disponibilizaremos uma CLI dedicada para avaliar arquivos `.rpy` diretamente.
240+
241+
### Copiando o README em formato raw
242+
243+
Para copiar o conteúdo completo deste arquivo com um único comando, utilize uma das opções abaixo:
244+
245+
```bash
246+
# Dentro do repositório clonado
247+
cat README.md
248+
249+
# Diretamente do GitHub (substitua `main` pelo branch desejado, se necessário)
250+
curl -L https://raw.githubusercontent.com/UnBCIC-TP2/r-python/main/README.md
251+
```
252+
253+
#### Enviando diretamente para a área de transferência
254+
255+
Se preferir já deixar o conteúdo pronto para colar, é possível combinar os comandos acima com as ferramentas padrão de cada
256+
sistema operacional:
257+
258+
```bash
259+
# macOS
260+
curl -L https://raw.githubusercontent.com/UnBCIC-TP2/r-python/main/README.md | pbcopy
261+
262+
# Linux (utilizando xclip)
263+
curl -L https://raw.githubusercontent.com/UnBCIC-TP2/r-python/main/README.md | xclip -selection clipboard
264+
265+
# Linux (Wayland com wl-copy)
266+
curl -L https://raw.githubusercontent.com/UnBCIC-TP2/r-python/main/README.md | wl-copy
267+
268+
# Windows (PowerShell)
269+
curl https://raw.githubusercontent.com/UnBCIC-TP2/r-python/main/README.md | Set-Clipboard
270+
```
271+
272+
> 💡 No Linux, instale o `xclip` com `sudo apt install xclip` (ou o gerenciador equivalente) caso não esteja disponível. Para ambientes Wayland, o pacote `wl-clipboard` fornece o comando `wl-copy` demonstrado acima.
273+
274+
## 📚 Documentação Complementar
275+
276+
- **[Environment Module](docs/environment.md)** – Escopos, tabelas de símbolos e política de resolução de nomes.
277+
- **[Parser Component](docs/parser.md)** – Estratégias de parsing com `nom`, gramática suportada e exemplos de AST.
278+
- **[Type Checker Module](docs/type_checker.md)** – Regras de tipagem, tipos suportados e roadmap do verificador. *(Em evolução)*
279+
280+
## 🤝 Contribuindo
281+
282+
Contribuições são muito bem-vindas! Antes de abrir issues ou enviar pull requests, consulte nossos guias:
283+
284+
- [Guia de Contribuição em Português](CONTRIBUTING_pt.md)
285+
- [Contributing Guidelines in English](CONTRIBUTING_en.md)
286+
287+
Fique à vontade para sugerir melhorias na linguagem, adicionar novos exemplos ou expandir a documentação.

0 commit comments

Comments
 (0)