@@ -49,7 +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
52+ CallStr , CallInt , CallRange , Phi , Add , CallType ,
53+ CallFloat , CallBool , CallRound , CallMin , CallMax , CallSum ,
54+ CallSorted , CallEnumerate , CallZip , CallList , CallTuple , CallDict ,
55+ CallIsInstance , CallSet , CallInput , CallChr , CallOrd
5356}
5457
5558#[ derive( Debug ) ] pub struct Instruction { pub opcode : OpCode , pub operand : u16 }
@@ -86,14 +89,14 @@ pub struct Parser<'src, I: Iterator<Item = Token>> {
8689 join_stack : Vec < JoinNode > ,
8790}
8891
89- fn parse_string ( s : & str ) -> String { /* igual que antes */
92+ fn parse_string ( s : & str ) -> String {
9093 let is_raw = s. contains ( 'r' ) || s. contains ( 'R' ) ;
9194 let s = s. trim_start_matches ( |c : char | "bBrRuU" . contains ( c) ) ;
9295 let inner = if s. starts_with ( "\" \" \" " ) || s. starts_with ( "'''" ) { & s[ 3 ..s. len ( ) -3 ] } else { & s[ 1 ..s. len ( ) -1 ] } ;
9396 if is_raw { inner. to_string ( ) } else { unescape ( inner) }
9497}
9598
96- fn unescape ( s : & str ) -> String { /* igual que antes */
99+ fn unescape ( s : & str ) -> String {
97100 let mut out = String :: with_capacity ( s. len ( ) ) ;
98101 let mut chars = s. chars ( ) . peekable ( ) ;
99102 while let Some ( c) = chars. next ( ) {
@@ -178,12 +181,12 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
178181 TokenType :: False => self . emit_const ( Value :: Bool ( false ) ) ,
179182 TokenType :: None => self . emit_const ( Value :: None ) ,
180183 TokenType :: FstringStart => self . fstring ( ) ,
181- TokenType :: Minus => { self . expr ( ) ; self . chunk . emit ( OpCode :: Minus , 0 ) ; }
184+ TokenType :: Minus => { self . expr ( ) ; self . chunk . emit ( OpCode :: Minus , 0 ) ; } ,
182185 _ => { }
183186 }
184187 }
185188
186- fn parse_number ( & mut self , raw : & str , kind : TokenType ) { /* igual que antes */
189+ fn parse_number ( & mut self , raw : & str , kind : TokenType ) {
187190 let s = raw. replace ( '_' , "" ) ;
188191 if kind == TokenType :: Float {
189192 self . emit_const ( Value :: Float ( s. parse ( ) . unwrap_or ( 0.0 ) ) ) ;
@@ -201,7 +204,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
201204 self . chunk . emit ( OpCode :: LoadConst , i) ;
202205 }
203206
204- fn name ( & mut self , t : Token ) { /* igual que antes */
207+ fn name ( & mut self , t : Token ) {
205208 let name = self . lexeme ( & t) . to_string ( ) ;
206209 if matches ! ( self . peek( ) , Some ( TokenType :: Colon ) ) { self . advance ( ) ; self . advance ( ) ; }
207210 match self . peek ( ) {
@@ -211,7 +214,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
211214 }
212215 }
213216
214- fn assign ( & mut self , name : String ) { /* igual */
217+ fn assign ( & mut self , name : String ) {
215218 self . advance ( ) ;
216219 self . expr ( ) ;
217220 let ver = self . increment_version ( & name) ;
@@ -220,7 +223,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
220223 self . chunk . emit ( OpCode :: StoreName , i) ;
221224 }
222225
223- fn parse_args ( & mut self ) -> u16 { /* igual */
226+ fn parse_args ( & mut self ) -> u16 {
224227 self . advance ( ) ;
225228 let mut argc = 0 ;
226229 while !matches ! ( self . peek( ) , Some ( TokenType :: Rpar ) | None ) {
@@ -231,13 +234,31 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
231234 argc
232235 }
233236
234- fn call ( & mut self , name : String ) { /* igual */
237+ fn call ( & mut self , name : String ) {
235238 match name. as_str ( ) {
236239 "print" => { let _ = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallPrint , 0 ) ; }
237240 "len" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallLen , a) ; }
238241 "abs" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallAbs , a) ; }
239242 "str" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallStr , a) ; }
240243 "int" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallInt , a) ; }
244+ "type" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallType , a) ; }
245+ "float" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallFloat , a) ; }
246+ "bool" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallBool , a) ; }
247+ "round" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallRound , a) ; }
248+ "min" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallMin , a) ; }
249+ "max" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallMax , a) ; }
250+ "sum" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallSum , a) ; }
251+ "sorted" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallSorted , a) ; }
252+ "enumerate" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallEnumerate , a) ; }
253+ "zip" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallZip , a) ; }
254+ "list" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallList , a) ; }
255+ "tuple" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallTuple , a) ; }
256+ "dict" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallDict , a) ; }
257+ "set" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallSet , a) ; }
258+ "input" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallInput , a) ; }
259+ "isinstance" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallIsInstance , a) ; }
260+ "chr" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallChr , a) ; }
261+ "ord" => { let a = self . parse_args ( ) ; self . chunk . emit ( OpCode :: CallOrd , a) ; }
241262 "range" => self . call_range ( ) ,
242263 _ => {
243264 let i = self . chunk . push_name ( & name) ;
@@ -248,7 +269,8 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
248269 }
249270 }
250271
251- fn call_range ( & mut self ) { /* igual */
272+ fn call_range ( & mut self ) {
273+ self . advance ( ) ;
252274 let mut args = Vec :: new ( ) ;
253275 while !matches ! ( self . peek( ) , Some ( TokenType :: Rpar ) | None ) {
254276 let tok = self . advance ( ) ;
@@ -258,14 +280,17 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
258280 if matches ! ( self . peek( ) , Some ( TokenType :: Comma ) ) { self . advance ( ) ; }
259281 }
260282 self . advance ( ) ;
283+
261284 let ( start, stop, step) = match args. as_slice ( ) {
262- [ stop] => ( 0 , * stop, 1 ) ,
263- [ start, stop] => ( * start, * stop, 1 ) ,
285+ [ stop] => ( 0 , * stop, 1 ) ,
286+ [ start, stop] => ( * start, * stop, 1 ) ,
264287 [ start, stop, step] => ( * start, * stop, * step) ,
265- _ => ( 0 , 0 , 1 ) ,
288+ _ => ( 0 , 0 , 1 ) ,
266289 } ;
267- for v in [ start, stop, step] { self . emit_const ( Value :: Int ( v) ) ; }
268- self . chunk . emit ( OpCode :: CallRange , 3 ) ;
290+
291+ let i = self . chunk . push_const ( Value :: Range ( start, stop, step) ) ;
292+ self . chunk . emit ( OpCode :: LoadConst , i) ;
293+ self . chunk . emit ( OpCode :: CallRange , 1 ) ;
269294 }
270295
271296 fn fstring ( & mut self ) {
@@ -274,60 +299,22 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
274299 match self . peek ( ) {
275300 Some ( TokenType :: FstringMiddle ) => {
276301 let t = self . advance ( ) ;
277- let mut rest = self . lexeme ( & t) ;
278-
279- while let Some ( open) = rest. find ( '{' ) {
280- if open > 0 {
281- self . emit_const ( Value :: Str ( rest[ ..open] . to_string ( ) ) ) ;
282- parts += 1 ;
283- }
284- rest = & rest[ open + 1 ..] ;
285-
286- if let Some ( close) = rest. find ( '}' ) {
287- let expr = rest[ ..close] . trim ( ) ;
288- if !expr. is_empty ( ) {
289- self . parse_fstring_expr ( expr) ;
290- self . chunk . emit ( OpCode :: FormatValue , 0 ) ;
291- parts += 1 ;
292- }
293- rest = & rest[ close + 1 ..] ;
294- } else {
295- break ;
296- }
297- }
298-
299- if !rest. is_empty ( ) {
300- self . emit_const ( Value :: Str ( rest. to_string ( ) ) ) ;
301- parts += 1 ;
302+ self . emit_const ( Value :: Str ( self . lexeme ( & t) . to_string ( ) ) ) ;
303+ parts += 1 ;
304+ }
305+ Some ( TokenType :: Lbrace ) => {
306+ self . advance ( ) ; // consume '{'
307+ self . expr ( ) ; // ← parser normal, soporta TODO
308+ self . chunk . emit ( OpCode :: FormatValue , 0 ) ;
309+ parts += 1 ;
310+ if matches ! ( self . peek( ) , Some ( TokenType :: Rbrace ) ) {
311+ self . advance ( ) ; // consume '}'
302312 }
303313 }
304314 Some ( TokenType :: FstringEnd ) => { self . advance ( ) ; break ; }
305315 _ => break ,
306316 }
307317 }
308- if parts > 0 {
309- self . chunk . emit ( OpCode :: BuildString , parts) ;
310- }
311- }
312-
313- fn parse_fstring_expr ( & mut self , expr : & str ) {
314- if expr. chars ( ) . all ( |c| c. is_alphanumeric ( ) || c == '_' ) && !expr. starts_with ( char:: is_numeric) {
315- // Caso simple: {euler}
316- self . emit_load_ssa ( expr. to_string ( ) ) ;
317- } else if let Some ( pos) = expr. find ( " + " ) {
318- // Caso {euler + 5}
319- let left = expr[ ..pos] . trim ( ) ;
320- let right = expr[ pos + 3 ..] . trim ( ) ;
321- self . emit_load_ssa ( left. to_string ( ) ) ;
322- if let Ok ( num) = right. parse :: < i64 > ( ) {
323- self . emit_const ( Value :: Int ( num) ) ;
324- } else {
325- self . emit_const ( Value :: Str ( right. to_string ( ) ) ) ;
326- }
327- self . chunk . emit ( OpCode :: Add , 0 ) ;
328- } else {
329- // Fallback seguro
330- self . emit_const ( Value :: Str ( expr. to_string ( ) ) ) ;
331- }
318+ if parts > 0 { self . chunk . emit ( OpCode :: BuildString , parts) ; }
332319 }
333320}
0 commit comments