Skip to content

Commit 509b8fd

Browse files
Feat: Implemented dict and list for build and updated IT.
1 parent 6b5161f commit 509b8fd

4 files changed

Lines changed: 52 additions & 5 deletions

File tree

compiler/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ fn main() {
2929

3030
initialize_logger();
3131

32-
let source = "name: str = 'Dylan'\nage: int = 25\nmsg: str = f'User {name} is {age} years old'";
32+
let source = "dict()\ndict(a=1)\n{'a': 1}\ndict({'a': 1})";
3333

3434
let chunk = modules::parser::Parser::new(source, modules::lexer::lexer(source)).parse();
3535

compiler/src/modules/parser.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ use std::collections::HashMap;
4949
pub enum OpCode {
5050
LoadConst, LoadName, StoreName, Call, PopTop, ReturnValue,
5151
BuildString, CallPrint, CallLen, FormatValue, CallAbs, Minus,
52-
CallStr, CallInt, CallRange, Phi, Add, CallType,
52+
CallStr, CallInt, CallRange, Phi, CallChr, CallType,
5353
CallFloat, CallBool, CallRound, CallMin, CallMax, CallSum,
5454
CallSorted, CallEnumerate, CallZip, CallList, CallTuple, CallDict,
55-
CallIsInstance, CallSet, CallInput, CallChr, CallOrd
55+
CallIsInstance, CallSet, CallInput, CallOrd, BuildDict, BuildList
5656
}
5757

5858
#[derive(Debug)] pub struct Instruction { pub opcode: OpCode, pub operand: u16 }
@@ -156,6 +156,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
156156
}
157157
}
158158
}
159+
159160
fn advance(&mut self) -> Token { self.tokens.next().unwrap() }
160161
fn at_end(&mut self) -> bool { self.peek().is_none() }
161162
fn lexeme(&self, t: &Token) -> &'src str { &self.source[t.start..t.end] }
@@ -182,10 +183,36 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
182183
TokenType::None => self.emit_const(Value::None),
183184
TokenType::FstringStart => self.fstring(),
184185
TokenType::Minus => { self.expr(); self.chunk.emit(OpCode::Minus, 0); },
186+
TokenType::Lbrace => self.dict_literal(), // ← agrega
187+
TokenType::Lsqb => self.list_literal(), // ← agrega
185188
_ => {}
186189
}
187190
}
188191

192+
fn dict_literal(&mut self) {
193+
let mut pairs = 0u16;
194+
while !matches!(self.peek(), Some(TokenType::Rbrace) | None) {
195+
self.expr(); // clave
196+
if matches!(self.peek(), Some(TokenType::Colon)) { self.advance(); }
197+
self.expr(); // valor
198+
pairs += 1;
199+
if matches!(self.peek(), Some(TokenType::Comma)) { self.advance(); }
200+
}
201+
self.advance(); // consume '}'
202+
self.chunk.emit(OpCode::BuildDict, pairs);
203+
}
204+
205+
fn list_literal(&mut self) {
206+
let mut count = 0u16;
207+
while !matches!(self.peek(), Some(TokenType::Rsqb) | None) {
208+
self.expr();
209+
count += 1;
210+
if matches!(self.peek(), Some(TokenType::Comma)) { self.advance(); }
211+
}
212+
self.advance(); // consume ']'
213+
self.chunk.emit(OpCode::BuildList, count);
214+
}
215+
189216
fn parse_number(&mut self, raw: &str, kind: TokenType) {
190217
let s = raw.replace('_', "");
191218
if kind == TokenType::Float {
@@ -227,7 +254,21 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
227254
self.advance();
228255
let mut argc = 0;
229256
while !matches!(self.peek(), Some(TokenType::Rpar) | None) {
230-
self.expr(); argc += 1;
257+
// kwarg: name=value → emite ("name", value)
258+
if matches!(self.peek(), Some(TokenType::Name)) {
259+
let t = self.advance();
260+
if matches!(self.peek(), Some(TokenType::Equal)) {
261+
self.advance();
262+
let i = self.chunk.push_const(Value::Str(self.lexeme(&t).to_string()));
263+
self.chunk.emit(OpCode::LoadConst, i);
264+
self.expr();
265+
} else {
266+
self.name(t); // expresión normal
267+
}
268+
} else {
269+
self.expr();
270+
}
271+
argc += 1;
231272
if matches!(self.peek(), Some(TokenType::Comma)) { self.advance(); }
232273
}
233274
self.advance();

compiler/tests/cases/parser_cases.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,11 @@
2828
["Range(0, 4, 1)"],
2929
[],
3030
[["LoadConst",0], ["CallRange",1], ["PopTop",0], ["ReturnValue",0]]
31+
],
32+
[
33+
"dict()\ndict(a=1)\n{'a': 1}\ndict({'a': 1})",
34+
["a", "1", "a", "1", "a", "1"],
35+
[],
36+
[["CallDict",0], ["PopTop",0], ["LoadConst",0], ["LoadConst",1], ["CallDict",1], ["PopTop",0], ["LoadConst",2], ["LoadConst",3], ["BuildDict",1], ["PopTop",0], ["LoadConst",4], ["LoadConst",5], ["BuildDict",1], ["CallDict",1], ["PopTop",0], ["ReturnValue",0]]
3137
]
3238
]

documentation/implementation/syntax.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ x = 42
5050

5151
FStrings parse from `FstringStart -> FstringMiddle -> FstringEnd` token sequence. Each `FstringMiddle` scanned for `{name}` expressions (`f"Hey, {name}."`).
5252

53-
Supported: simple name {name} and binary addition {name + expr}.
53+
Supported: simple name `{name}` and binary addition `{name + expr}`.
5454

5555
## SSA Form
5656

0 commit comments

Comments
 (0)