forked from UnBCIC-TP2/r-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathREADME
More file actions
203 lines (143 loc) · 5.34 KB
/
README
File metadata and controls
203 lines (143 loc) · 5.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# R-Python: Um Interpretador Python em Rust
## Visão Geral
R-Python é uma implementação de um dialeto Python em Rust, focando em uma versão simplificada e imperativa. O projeto implementa um parser usando a biblioteca nom e um interpretador que suporta uma AST com tipos algébricos.
## Componentes Principais
### AST (Abstract Syntax Tree)
**Localização:** [`src/ir/ast.rs`](src/ir/ast.rs)
A AST define dois tipos principais:
#### Expression
-> Representa expressões como constantes, variáveis e operações:
```rust
pub enum Expression {
CInt(i32), // Constantes inteiras
Var(String), // Variáveis
Add(Box<Expression>, Box<Expression>), // Adição
Sub(Box<Expression>, Box<Expression>), // Subtração
Mul(Box<Expression>, Box<Expression>), // Multiplicação
Div(Box<Expression>, Box<Expression>), // Divisão
Comparison(Box<Expression>, String, Box<Expression>)// Comparações
}
#### Statement
-> Representa comandos como atribuições e estruturas de controle
pub enum Statement {
VarDeclaration(Box<Name>),
ValDeclaration(Box<Name>),
Assignment(Box<Name>, Box<Expression>),
IfThenElse(Box<Expression>, Box<Statement>, Box<Statement>),
While(Box<Expression>, Box<Statement>),
Block(Vec<Statement>),
Sequence(Box<Statement>, Box<Statement>),
}
Parser
Localização: src/parser/parser.rs
O parser utiliza a biblioteca nom para análise sintática e implementa:
Parsing de Expressões:
Constantes numéricas
Variáveis
Operações aritméticas
Comparações
Parsing de Comandos:
Atribuições
Estruturas if-else
Blocos indentados
Sequências de comandos
Interpretador
Localização: src/interpreter/interpreter.rs
O interpretador implementa duas funções principais:
eval: Avalia expressões
pub fn eval(exp: &Expression, env: &Environment) -> Result<IntValue, ErrorMessage>
execute: Executa comandos
pub fn execute(stmt: &Statement, env: Environment) -> Result<Environment, ErrorMessage>
Funcionalidades Implementadas
✅ Expressões aritméticas
✅ Variáveis e atribuições
✅ Estruturas if-else
✅ Blocos indentados
✅ Operadores de comparação
✅ Sequências de comandos
✅ Ambiente de execução
Testes
O projeto inclui testes extensivos para todas as funcionalidades:
Testes do Parser:
Atribuições simples
Expressões complexas
Estruturas if-else
Indentação
Programa completo
Testes do Interpretador:
Avaliação de expressões
Execução de comandos
Manipulação do ambiente
Fluxo de controle
Exemplos de Código Suportado
# Exemplo 1: Operações Aritméticas
x = 5
y = 3
z = (x * y) + (10 - 4)
# Exemplo 2: Estruturas de Controle
x = 10
if x > 5:
y = 1
else:
y = 2
# Limitações Atuais
❌ Não suporta definição de funções
❌ Tipagem estática não implementada
❌ Escopo limitado a variáveis globais
❌ Sem suporte a strings ou outros tipos além de inteiros
# Explicação do Parser
# 1. Funções Básicas de Parsing
fn identifier(input: &str) -> IResult<&str, Name>
-> Parse de identificadores (nomes de variáveis)
-> Aceita caracteres alfanuméricos e underscore
-> Retorna uma String
fn integer(input: &str) -> IResult<&str, Expression>
->Parse de números inteiros
->Converte string de dígitos para Expression::CInt
# 2. Expressões e Operadores
fn term(input: &str) -> IResult<&str, Expression>
Parse de termos básicos:
-> Expressões entre parênteses
-> Números inteiros
-> Identificadores
fn operator(input: &str) -> IResult<&str, &str>
-> Parse de operadores aritméticos (+, -, *, /)
fn comparison_operator(input: &str) -> IResult<&str, &str>
-> Parse de operadores de comparação (==, !=, >=, <=, >, <)
# 3. Expressões Complexas
fn arithmetic_expression(input: &str) -> IResult<&str, Expression>
-> Parse de expressões aritméticas completas
-> Implementa precedência de operadores
-> Constrói AST com operações aninhadas
fn comparison_expression(input: &str) -> IResult<&str, Expression>
-> Parse de expressões de comparação
-> Gera Expression::Comparison com operador e operandos
# 4. Statements e Blocos
fn assignment(input: &str) -> IResult<&str, Statement>
-> Parse de atribuições (x = expr)
-> Lida com whitespace antes/depois do '='
fn if_statement(input: &str) -> IResult<&str, Statement>
-> Parse de estruturas if-else
-> Lida com condição e blocos then/else
-> Suporta indentação Python-style
fn indented_block(input: &str) -> IResult<&str, Vec<Statement>>
-> Parse de blocos indentados
-> Gerencia indentação consistente
-> Agrupa statements em um bloco
# 5. Funções Principais
pub fn parse_statements(input: &str) -> IResult<&str, Vec<Statement>>
-> Parse de múltiplos statements
-> Lida com quebras de linha entre statements
-> Gerencia whitespace inicial/final
pub fn parse(input: &str) -> IResult<&str, Vec<Statement>>
-> Função principal de parsing
-> Entry point do parser
-> Retorna lista de statements parseados
# 6. Características Especiais
-> Suporte a indentação estilo Python
-> Precedência de operadores
-> Expressões parentizadas
-> Whitespace flexível
-> Blocos aninhados
-> Error handling robusto
Esta implementação usa a biblioteca nom para criar um parser declarativo e composicional, com excelente tratamento de erros e suporte a features avançadas como indentação significativa.