@@ -49,10 +49,10 @@ use std::collections::HashMap;
4949pub 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 ( ) ;
0 commit comments