@@ -6,7 +6,7 @@ pub extern crate lexer;
66
77use lexer:: token:: { TokenKind , Token , Span } ;
88use lexer:: Lexer ;
9- use crate :: ast:: { Program , Statement , Expression , Node , Literal , BlockStatement , Let , Integer , Boolean , StringType , Array , Hash } ;
9+ use crate :: ast:: { Program , Statement , Expression , Node , Literal , BlockStatement , Let , Integer , Boolean , StringType , Array , Hash , PREFIX } ;
1010use crate :: precedences:: { Precedence , get_token_precedence} ;
1111
1212type ParseError = String ;
@@ -104,7 +104,7 @@ impl<'a> Parser<'a> {
104104 self . expect_peek ( & TokenKind :: ASSIGN ) ?;
105105 self . next_token ( ) ;
106106
107- let value = self . parse_expression ( Precedence :: LOWEST ) ?;
107+ let value = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
108108
109109 if self . peek_token_is ( & TokenKind :: SEMICOLON ) {
110110 self . next_token ( ) ;
@@ -125,7 +125,7 @@ impl<'a> Parser<'a> {
125125 fn parse_return_statement ( & mut self ) -> Result < Statement , ParseError > {
126126 self . next_token ( ) ;
127127
128- let value = self . parse_expression ( Precedence :: LOWEST ) ?;
128+ let value = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
129129
130130 if self . peek_token_is ( & TokenKind :: SEMICOLON ) {
131131 self . next_token ( ) ;
@@ -135,24 +135,33 @@ impl<'a> Parser<'a> {
135135 }
136136
137137 fn parse_expression_statement ( & mut self ) -> Result < Statement , ParseError > {
138- let expr = self . parse_expression ( Precedence :: LOWEST ) ?;
138+ let expr = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
139139 if self . peek_token_is ( & TokenKind :: SEMICOLON ) {
140140 self . next_token ( ) ;
141141 }
142142
143143 Ok ( Statement :: Expr ( expr) )
144144 }
145145
146- fn parse_expression ( & mut self , precedence : Precedence ) -> Result < Expression , ParseError > {
146+ fn parse_expression ( & mut self , precedence : Precedence ) -> Result < ( Expression , Span ) , ParseError > {
147+ let start = self . current_token . span . start ;
147148 let mut left = self . parse_prefix_expression ( ) ?;
148149 while self . peek_token . kind != TokenKind :: SEMICOLON && precedence < get_token_precedence ( & self . peek_token . kind ) {
149150 match self . parse_infix_expression ( & left) {
150151 Some ( infix) => left = infix?,
151- None => return Ok ( left) ,
152+ None => return Ok ( ( left, Span {
153+ start,
154+ end : self . current_token . span . end
155+ } ) ) ,
152156 }
153157 }
154158
155- Ok ( left)
159+ let end = self . current_token . span . end ;
160+
161+ Ok ( ( left, Span {
162+ start,
163+ end,
164+ } ) )
156165 }
157166
158167 fn parse_prefix_expression ( & mut self ) -> Result < Expression , ParseError > {
@@ -175,16 +184,24 @@ impl<'a> Parser<'a> {
175184 span : self . current_token . clone ( ) . span ,
176185 } ) ) ) ,
177186 TokenKind :: BANG | TokenKind :: MINUS => {
187+ let start = self . current_token . span . start ;
178188 let prefix_op = self . current_token . clone ( ) ;
179189 self . next_token ( ) ;
180- let expr = self . parse_expression ( Precedence :: PREFIX ) ?;
181- return Ok ( Expression :: PREFIX ( prefix_op, Box :: new ( expr) ) ) ;
190+ let ( expr, span) = self . parse_expression ( Precedence :: PREFIX ) ?;
191+ return Ok ( Expression :: PREFIX ( PREFIX {
192+ op : prefix_op,
193+ operand : Box :: new ( expr) ,
194+ span : Span {
195+ start,
196+ end : span. end
197+ }
198+ } ) ) ;
182199 }
183200 TokenKind :: LPAREN => {
184201 self . next_token ( ) ;
185- let expr = self . parse_expression ( Precedence :: LOWEST ) ;
202+ let expr = self . parse_expression ( Precedence :: LOWEST ) ? . 0 ;
186203 self . expect_peek ( & TokenKind :: RPAREN ) ?;
187- return expr;
204+ return Ok ( expr) ;
188205 }
189206 TokenKind :: IF => self . parse_if_expression ( ) ,
190207 TokenKind :: FUNCTION => self . parse_fn_expression ( ) ,
@@ -217,7 +234,7 @@ impl<'a> Parser<'a> {
217234 let infix_op = self . current_token . clone ( ) ;
218235 let precedence_value = get_token_precedence ( & self . current_token . kind ) ;
219236 self . next_token ( ) ;
220- let right: Expression = self . parse_expression ( precedence_value) . unwrap ( ) ;
237+ let right: Expression = self . parse_expression ( precedence_value) . unwrap ( ) . 0 ;
221238 return Some ( Ok ( Expression :: INFIX ( infix_op, Box :: new ( left. clone ( ) ) , Box :: new ( right) ) ) ) ;
222239 }
223240 TokenKind :: LPAREN => {
@@ -236,7 +253,7 @@ impl<'a> Parser<'a> {
236253 self . expect_peek ( & TokenKind :: LPAREN ) ?;
237254 self . next_token ( ) ;
238255
239- let condition = self . parse_expression ( Precedence :: LOWEST ) ?;
256+ let condition = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
240257 self . expect_peek ( & TokenKind :: RPAREN ) ?;
241258 self . expect_peek ( & TokenKind :: LBRACE ) ?;
242259
@@ -327,12 +344,12 @@ impl<'a> Parser<'a> {
327344
328345 self . next_token ( ) ;
329346
330- expr_list. push ( self . parse_expression ( Precedence :: LOWEST ) ?) ;
347+ expr_list. push ( self . parse_expression ( Precedence :: LOWEST ) ?. 0 ) ;
331348
332349 while self . peek_token_is ( & TokenKind :: COMMA ) {
333350 self . next_token ( ) ;
334351 self . next_token ( ) ;
335- expr_list. push ( self . parse_expression ( Precedence :: LOWEST ) ?) ;
352+ expr_list. push ( self . parse_expression ( Precedence :: LOWEST ) ?. 0 ) ;
336353 }
337354
338355 self . expect_peek ( end) ?;
@@ -346,7 +363,7 @@ impl<'a> Parser<'a> {
346363
347364 fn parse_index_expression ( & mut self , left : Expression ) -> Result < Expression , ParseError > {
348365 self . next_token ( ) ;
349- let index = self . parse_expression ( Precedence :: LOWEST ) ?;
366+ let index = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
350367
351368 self . expect_peek ( & TokenKind :: RBRACKET ) ?;
352369
@@ -359,12 +376,12 @@ impl<'a> Parser<'a> {
359376 while !self . peek_token_is ( & TokenKind :: RBRACE ) {
360377 self . next_token ( ) ;
361378
362- let key = self . parse_expression ( Precedence :: LOWEST ) ?;
379+ let key = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
363380
364381 self . expect_peek ( & TokenKind :: COLON ) ?;
365382
366383 self . next_token ( ) ;
367- let value = self . parse_expression ( Precedence :: LOWEST ) ?;
384+ let value = self . parse_expression ( Precedence :: LOWEST ) ?. 0 ;
368385
369386 map. push ( ( key, value) ) ;
370387
0 commit comments