Skip to content

Commit 5a17e94

Browse files
Merge pull request #11 from BeyondMagic/feat/array
feat(semantic): organize code
2 parents 1bcf870 + 308aa43 commit 5a17e94

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1325
-346
lines changed

Cronograma.md

Lines changed: 0 additions & 66 deletions
This file was deleted.

Makefile

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ LEX_OUT = lex.yy.c
1616
YACC_OUT = parser.tab.c
1717
YACC_HEADER = parser.tab.h
1818

19+
PASS_DIR = tests/pass
20+
PASS_SOURCES := $(wildcard $(PASS_DIR)/*.c)
21+
PASS_CASES := $(basename $(notdir $(PASS_SOURCES)))
22+
FAIL_DIR = tests/fail
23+
FAIL_SOURCES := $(wildcard $(FAIL_DIR)/*.c)
24+
FAIL_CASES := $(basename $(notdir $(FAIL_SOURCES)))
25+
1926
all: $(TARGET)
2027

2128
$(TARGET): $(LEX_OUT) $(YACC_OUT) $(SRC)
@@ -30,22 +37,66 @@ $(YACC_OUT) $(YACC_HEADER): $(YACC_SRC) src/ast.h src/ast.c
3037
clean:
3138
rm -f $(TARGET) $(LEX_OUT) $(YACC_OUT) $(YACC_HEADER)
3239

33-
TEST_CASES = \
34-
expressions \
35-
variable
36-
37-
test: all
38-
@echo "== Running sample tests =="
39-
@for case in $(TEST_CASES); do \
40-
output=$$(./c2lua tests/$$case.c); \
41-
expected=$$(cat tests/$$case.lua); \
42-
printf '%s' "-- $$case... "; \
43-
if [ "$$output" = "$$expected" ]; then \
44-
echo "ok"; \
45-
else \
46-
echo "fail"; \
47-
printf 'Expected:\n%s\n\nGot:\n%s\n' "$$expected" "$$output"; \
48-
exit 1; \
49-
fi; \
50-
done
51-
@echo "All tests passed."
40+
test: test-pass test-fail
41+
42+
test-pass: all
43+
@echo "== Running pass tests =="
44+
@if [ -z "$(PASS_CASES)" ]; then \
45+
echo "No pass tests found under $(PASS_DIR)"; \
46+
else \
47+
for case in $(PASS_CASES); do \
48+
input="$(PASS_DIR)/$$case.c"; \
49+
expected_file="$(PASS_DIR)/$$case.lua"; \
50+
if [ ! -f "$$expected_file" ]; then \
51+
echo "Missing expected Lua file for $$case"; \
52+
exit 1; \
53+
fi; \
54+
output=$$(./c2lua "$$input"); \
55+
expected=$$(cat "$$expected_file"); \
56+
printf '%s' "-- $$case... "; \
57+
if [ "$$output" = "$$expected" ]; then \
58+
echo "ok"; \
59+
else \
60+
echo "fail"; \
61+
printf 'Expected:\n%s\n\nGot:\n%s\n' "$$expected" "$$output"; \
62+
exit 1; \
63+
fi; \
64+
done; \
65+
echo "All pass tests passed."; \
66+
fi
67+
68+
test-fail: all
69+
@echo "== Running fail tests =="
70+
@if [ -z "$(FAIL_CASES)" ]; then \
71+
echo "No fail tests found under $(FAIL_DIR)"; \
72+
else \
73+
for case in $(FAIL_CASES); do \
74+
input="$(FAIL_DIR)/$$case.c"; \
75+
expected_err="$(FAIL_DIR)/$$case.err"; \
76+
if [ ! -f "$$expected_err" ]; then \
77+
echo "Missing expected .err file for $$case"; \
78+
exit 1; \
79+
fi; \
80+
tmp_err=$$(mktemp); \
81+
if ./c2lua "$$input" > /dev/null 2> "$$tmp_err"; then \
82+
echo "-- $$case... fail"; \
83+
echo "Expected compilation error but succeeded."; \
84+
rm -f "$$tmp_err"; \
85+
exit 1; \
86+
fi; \
87+
if diff -u "$$expected_err" "$$tmp_err" > /dev/null; then \
88+
echo "-- $$case... ok"; \
89+
else \
90+
echo "-- $$case... fail"; \
91+
echo "Expected:"; \
92+
cat "$$expected_err"; \
93+
echo; \
94+
echo "Got:"; \
95+
cat "$$tmp_err"; \
96+
rm -f "$$tmp_err"; \
97+
exit 1; \
98+
fi; \
99+
rm -f "$$tmp_err"; \
100+
done; \
101+
echo "All fail tests passed."; \
102+
fi

README.md

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,59 @@ O que não será suportado:
1414

1515
```
1616
.
17-
├── lexer/ # regras léxicas (lexer.l)
18-
├── parser/ # gramática e ações (parser.y)
19-
├── src/ # main.c, AST, tabela de símbolos, gerador Lua
20-
├── tests/ # entradas C e saídas Lua esperadas
17+
├── lexer/ # regras léxicas (lexer.l)
18+
├── parser/ # gramática e ações (parser.y)
19+
├── src/ # main.c, AST, tabela de símbolos, gerador Lua
20+
├── tests/
21+
│ ├── pass/ # casos que devem passar
22+
│ └── fail/ # casos que precisam falhar
2123
└── Makefile
2224
```
2325

24-
Ambiente rápido (Linux):
25-
```nu
26+
## Ambiente de Desenvolvimento
27+
28+
Ubuntu Linux:
29+
```bash
2630
sudo apt update
2731
sudo apt install -y flex bison build-essential git
2832
```
2933

34+
Arch Linux:
35+
```bash
36+
sudo pacman -Syu flex bison base-devel git
37+
```
38+
3039
Build local (exemplo mínimo):
31-
```nu
32-
flex lexer/lexer.l
33-
bison -d parser/parser.y
34-
gcc -o c2lua lex.yy.c parser.tab.c src/*.c -lfl
35-
./c2lua < tests/exemplo.c > out.lua
40+
```bash
41+
make
42+
./c2lua tests/pass/expressions.c
3643
```
3744

3845
# Documentação de cada sprint
3946

4047
- [1ª sprint](./docs/sprints/1.md);
4148
- [2ª sprint](./docs/sprints/2.md);
42-
- 3ª sprint;
43-
- 4ª sprint;
49+
- [3ª sprint](./docs/sprints/3.md);
50+
- [4ª sprint](./docs/sprints/4.md);
4451

4552
# Testes
4653

47-
A pasta `tests/` contém arquivos `.c` de entrada e os correspondentes `.lua` esperados. Use `diff` para comparar a saída gerada com a esperada.
54+
A pasta `tests/` está organizada em:
55+
- `tests/semantic/pass`: casos que devem gerar Lua válido e executar com sucesso;
56+
- `tests/semantic/fail`: casos que precisam falhar na análise semântica (arquivos `.err` com a mensagem esperada);
57+
58+
Execute as suítes pelo Makefile:
59+
60+
```bash
61+
make test # verifica os smoke tests (tradução direta C -> Lua)
62+
```
63+
64+
Os golden files utilizam o mesmo nome-base do arquivo `.c`, com extensão `.lua` (para PASS) ou `.golden`/`.err` (para FAIL).
65+
66+
# Membros
4867

49-
Padrão de nomenclatura: `descricao_curta_teste.c` para entrada, e `descricao_curta_teste.lua` para saída esperada.
68+
- Andre Lopes de Sousa - 211031593
69+
- João Victor da Silva Batista de Farias - 221022604
70+
- Livia Rodrigues Reis - 180105051
71+
- Marco Marques de Castro - 211062197
72+
- Sophia Souza da Silva - 231026886

docs/sprints/3.md

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
## Sprint 3 (D21–D30) — AST, símbolos e semântica básica
1+
## Sprint 3 (D21–D40) — AST, símbolos e semântica básica
22

33
### Núcleo semântico unificado: definir AST (expr/stmt/decl/fun), tabela de símbolos com escopos, checagem/conversão int↔float e mensagens de erro com linha/coluna
44

5-
- [ ] responsáveis: @Sophiassilva
5+
- [x] responsáveis: @Sophiassilva
66
- **Entregáveis obrigatórios:**
77
- `src/ast.h` / `src/ast.c` com a hierarquia de nós (expressões, comandos, declarações, funções) e utilitários de criação/destruição.
88
- `src/symbol_table.h` / `src/symbol_table.c` com pilha de escopos (funções para `enter_scope`, `leave_scope`, `insert_symbol`, `lookup`).
@@ -25,16 +25,16 @@
2525
- **Promoção numérica:** `float y = 2 + 3.5;` deve produzir um nó Binário cujo resultado tem `TYPE_FLOAT`, convertendo o `2` para `2.0` automaticamente.
2626
- **Mensagem de erro rica:** `Erro [5:3]: variável 'z' não declarada; escopo atual possui {x, y}.`
2727

28-
### Suporte sintático essencial: declarações, atribuições, blocos, if/else, while/for, curto-circuito lógico e comparações (==, \!=, \<, \<=, \>, \>=)
28+
### Suporte sintático essencial: declarações, atribuições, blocos, if/else, while/for, lógico e comparações (==, \!=, \<, \<=, \>, \>=)
2929

30-
- [ ] responsáveis: @marcomarquesdc
30+
- [x] responsáveis: @marcomarquesdc
3131
- **Entregáveis obrigatórios:**
3232
- Regras no `src/parser.y` cobrindo:
3333
- Declaração de variáveis (com inicialização opcional) e de vetores 1D.
3434
- Atribuições simples e compostas (ex.: `+=`, se decidirmos suportar, documentar).
3535
- Blocos `{ ... }` com criação/destruição de escopo.
3636
- Estruturas de controle `if/else`, `while`, `for (init; cond; step)` e `do ... while`.
37-
- Operadores lógicos com curto-circuito (`&&`, `||`) e comparações.
37+
- Operadores lógicos (`&&`, `||`) e comparações.
3838
- Ações semânticas que instanciam nós da AST definidos na tarefa anterior.
3939
- Atualização dos tokens na `src/lexer.l` se novos operadores forem necessários (ex.: `<=`, `>=`, `!=` já existem; avaliar `+=`, `-=` etc.).
4040
- Casos de teste em `tests/syntax/` validando cada construção (happy path + caso de erro por falta de `;`).
@@ -43,7 +43,7 @@
4343
- Reutilizar a regra `program` para aceitar múltiplas declarações e funções.
4444
- Garantir que `for` seja reescrito em AST como um nó com três componentes (init/cond/update) e um corpo `Block`.
4545
- Incluir ações de `yyerror` informando token esperado, aproveitando localizações.
46-
- **Exemplo alvo:** além do snippet abaixo, teste `for` com incremento, e `if` aninhados com `&&`/`||` para confirmar curto-circuito.
46+
- **Exemplo alvo:** além do snippet abaixo, teste `for` com incremento, e `if` aninhados com `&&`/`||`.
4747
```c
4848
int i = 0;
4949
for (; i < 5 && i != 3; i = i + 1) {
@@ -57,17 +57,16 @@
5757
5858
### Análise Semântica: missão Lua abrangente: variáveis locais, expressões, operadores lógicos, arrays 1D como tabelas, mapeamento de printf/puts, helpers de runtime quando necessário
5959
60-
- [ ] responsáveis: @Liviarodrigues1
60+
- [x] responsáveis: @Liviarodrigues1
6161
- **Entregáveis obrigatórios:**
62-
- Módulo `src/semantics.c` com passagens sobre a AST para checar tipos, resolver identificadores e anotar cada nó com tipo final.
6362
- Implementação das regras de promoção (int→float, char→int, bool→int quando permitido) e erros quando a combinação é inválida (`int + string`, `if` com expressão não booleana, etc.).
6463
- Representação de arrays como vetores Lua (`{}`) incluindo deslocamento +1 no índice.
6564
- Funções helper em `runtime/printf.lua` ou similar para cobrir `printf`/`puts` e conversões básicas.
6665
- Relatório de semântica (ex.: `docs/relatorios/semantica_sprint3.md`) com casos validados e conhecidos a resolver.
6766
- **Passos sugeridos:**
6867
- Percorrer a AST pós-parsing: primeiro declaração de variáveis/funções, depois corpo.
6968
- Armazenar em cada nó `AstExpression` os campos `type` e flags (`is_const`, `is_lvalue`).
70-
- Sempre que gerar Lua, garantir que `&&` e `||` se tornem `and`/`or` e mantenham curto-circuito (uso direto já atende).
69+
- Sempre que gerar Lua, garantir que `&&` e `||` se tornem `and`/`or`.
7170
- Para arrays, converter `arr[i]` em `arr[i + 1]` no código gerado.
7271
- Incluir testes: `tests/semantic/pass/*.c` (sem erros) e `tests/semantic/fail/*.c` (erro esperado com golden file da mensagem).
7372
- **Exemplos ampliados de tradução C → Lua:**
@@ -81,16 +80,6 @@
8180
local arr = {10, 20, 30}
8281
arr[2] = 99
8382
```
84-
- **Curto-circuito com ponteiros simulados:**
85-
```c
86-
if (ptr != NULL && ptr->val > 10) { log(ptr->val); }
87-
```
88-
89-
```lua
90-
if ptr ~= nil and ptr.val > 10 then
91-
log(ptr.val)
92-
end
93-
```
9483
- **Mapeamento de `printf`:**
9584
```c
9685
printf("Valor: %d e %f\n", a, b);
@@ -102,7 +91,7 @@
10291
10392
### Funções completas: traduzir assinaturas e return de C para function Lua, preservar escopos e chamadas
10493
105-
- [ ] responsáveis: @BeyondMagic
94+
- [x] responsáveis: @BeyondMagic
10695
- **Entregáveis obrigatórios:**
10796
- Tradução de declarações de função para AST (`AstFunction`) com lista de parâmetros, tipo de retorno e bloco corpo.
10897
- Geração Lua correspondente em `src/codegen_lua.c` (novo arquivo) ou módulo existente, incluindo:
@@ -140,7 +129,7 @@
140129

141130
### Garantia de qualidade: testes de semântica (erros de escopo/tipo), golden files de erro, pipeline end-to-end (C → Lua → execução), linemap/diagnóstico e atualização de docs/demo
142131

143-
- [ ] responsáveis: @andrelopesdesousa
132+
- [x] responsáveis: @andrelopesdesousa
144133
- **Entregáveis obrigatórios:**
145134
- Estrutura de testes automatizados:
146135
- `tests/semantic/pass/*.c` + `.lua` esperados.

0 commit comments

Comments
 (0)