Skip to main content

parser/
lib.rs

1pub mod ast;
2mod ast_tree_test;
3mod parser_test;
4mod precedences;
5
6pub extern crate lexer;
7
8use crate::ast::{
9    Array, BinaryExpression, BlockStatement, Boolean, Expression, FunctionCall,
10    FunctionDeclaration, Hash, Index, Integer, Let, Literal, Node, Program, ReturnStatement,
11    Statement, StringType, UnaryExpression, IDENTIFIER, IF,
12};
13use crate::precedences::{get_token_precedence, Precedence};
14use lexer::token::{Span, Token, TokenKind};
15use lexer::Lexer;
16
17type ParseError = String;
18type ParseErrors = Vec<ParseError>;
19
20pub struct Parser<'a> {
21    lexer: Lexer<'a>,
22    current_token: Token,
23    peek_token: Token,
24    errors: ParseErrors,
25}
26
27impl<'a> Parser<'a> {
28    pub fn new(mut lexer: Lexer<'a>) -> Parser<'a> {
29        let cur = lexer.next_token();
30        let next = lexer.next_token();
31        let errors = Vec::new();
32        // in strict sense, rust can be as classic go pattern, but it requires more work
33        // so let's just use pattern matching
34        // ```rust
35        // type PrefixParseFn = fn() -> Result<Expression, ParseError>;
36        // type InfixParseFn = fn(Expression) -> Result<Expression, ParseError>;
37        // let prefix_parse_fns = HashMap::new();
38        // let infix_parse_fns = HashMap::new();
39        // ```
40
41        let p = Parser {
42            lexer,
43            current_token: cur,
44            peek_token: next,
45            errors,
46        };
47
48        return p;
49    }
50
51    fn next_token(&mut self) {
52        self.current_token = self.peek_token.clone();
53        self.peek_token = self.lexer.next_token();
54    }
55
56    fn current_token_is(&mut self, token: &TokenKind) -> bool {
57        self.current_token.kind == *token
58    }
59
60    fn peek_token_is(&mut self, token: &TokenKind) -> bool {
61        self.peek_token.kind == *token
62    }
63
64    fn expect_peek(&mut self, token: &TokenKind) -> Result<(), ParseError> {
65        self.next_token();
66        if self.current_token.kind == *token {
67            Ok(())
68        } else {
69            let e = format!("expected token: {} got: {}", token, self.current_token);
70            Err(e)
71        }
72    }
73
74    pub fn parse_program(&mut self) -> Result<Program, ParseErrors> {
75        let mut program = Program::new();
76        while !self.current_token_is(&TokenKind::EOF) {
77            match self.parse_statement() {
78                Ok(stmt) => program.body.push(stmt),
79                Err(e) => self.errors.push(e),
80            }
81            self.next_token();
82        }
83        program.span.end = self.current_token.span.end;
84
85        if self.errors.is_empty() {
86            return Ok(program);
87        } else {
88            return Err(self.errors.clone());
89        }
90    }
91
92    fn parse_statement(&mut self) -> Result<Statement, ParseError> {
93        match self.current_token.kind {
94            TokenKind::LET => self.parse_let_statement(),
95            TokenKind::RETURN => self.parse_return_statement(),
96            _ => self.parse_expression_statement(),
97        }
98    }
99
100    fn parse_let_statement(&mut self) -> Result<Statement, ParseError> {
101        let start = self.current_token.span.start;
102        self.next_token();
103
104        let name = self.current_token.clone();
105        let mut identifier_name = "".to_string();
106        match &self.current_token.kind {
107            TokenKind::IDENTIFIER {
108                name,
109            } => {
110                identifier_name = name.to_string();
111            }
112            _ => return Err(format!("{} not an identifier", self.current_token)),
113        };
114
115        self.expect_peek(&TokenKind::ASSIGN)?;
116        self.next_token();
117
118        let mut value = self.parse_expression(Precedence::LOWEST)?.0;
119        match value {
120            Expression::FUNCTION(ref mut f) => {
121                f.name = identifier_name;
122            }
123            _ => {}
124        }
125
126        if self.peek_token_is(&TokenKind::SEMICOLON) {
127            self.next_token();
128        }
129
130        let end = self.current_token.span.end;
131
132        return Ok(Statement::Let(Let {
133            identifier: name,
134            expr: value,
135            span: Span {
136                start,
137                end,
138            },
139        }));
140    }
141
142    fn parse_return_statement(&mut self) -> Result<Statement, ParseError> {
143        let start = self.current_token.span.start;
144        self.next_token();
145
146        let value = self.parse_expression(Precedence::LOWEST)?.0;
147
148        if self.peek_token_is(&TokenKind::SEMICOLON) {
149            self.next_token();
150        }
151        let end = self.current_token.span.end;
152
153        return Ok(Statement::Return(ReturnStatement {
154            argument: value,
155            span: Span {
156                start,
157                end,
158            },
159        }));
160    }
161
162    fn parse_expression_statement(&mut self) -> Result<Statement, ParseError> {
163        let expr = self.parse_expression(Precedence::LOWEST)?.0;
164        if self.peek_token_is(&TokenKind::SEMICOLON) {
165            self.next_token();
166        }
167
168        Ok(Statement::Expr(expr))
169    }
170
171    fn parse_expression(
172        &mut self,
173        precedence: Precedence,
174    ) -> Result<(Expression, Span), ParseError> {
175        let mut left_start = self.current_token.span.start;
176        let mut left = self.parse_prefix_expression()?;
177        while self.peek_token.kind != TokenKind::SEMICOLON
178            && precedence < get_token_precedence(&self.peek_token.kind)
179        {
180            match self.parse_infix_expression(&left, left_start) {
181                Some(infix) => {
182                    left = infix?;
183                    if let Expression::INFIX(b) = left.clone() {
184                        left_start = b.span.start;
185                    }
186                }
187                None => {
188                    return Ok((
189                        left,
190                        Span {
191                            start: left_start,
192                            end: self.current_token.span.end,
193                        },
194                    ))
195                }
196            }
197        }
198
199        let end = self.current_token.span.end;
200
201        Ok((
202            left,
203            Span {
204                start: left_start,
205                end,
206            },
207        ))
208    }
209
210    fn parse_prefix_expression(&mut self) -> Result<Expression, ParseError> {
211        // this is prefix fn map :)
212        match &self.current_token.kind {
213            TokenKind::IDENTIFIER {
214                name,
215            } => {
216                return Ok(Expression::IDENTIFIER(IDENTIFIER {
217                    name: name.clone(),
218                    span: self.current_token.clone().span,
219                }))
220            }
221            TokenKind::INT(i) => {
222                return Ok(Expression::LITERAL(Literal::Integer(Integer {
223                    raw: *i,
224                    span: self.current_token.clone().span,
225                })))
226            }
227            TokenKind::STRING(s) => {
228                return Ok(Expression::LITERAL(Literal::String(StringType {
229                    raw: s.to_string(),
230                    span: self.current_token.clone().span,
231                })))
232            }
233            b @ TokenKind::TRUE | b @ TokenKind::FALSE => {
234                return Ok(Expression::LITERAL(Literal::Boolean(Boolean {
235                    raw: *b == TokenKind::TRUE,
236                    span: self.current_token.clone().span,
237                })))
238            }
239            TokenKind::BANG | TokenKind::MINUS => {
240                let start = self.current_token.span.start;
241                let prefix_op = self.current_token.clone();
242                self.next_token();
243                let (expr, span) = self.parse_expression(Precedence::PREFIX)?;
244                return Ok(Expression::PREFIX(UnaryExpression {
245                    op: prefix_op,
246                    operand: Box::new(expr),
247                    span: Span {
248                        start,
249                        end: span.end,
250                    },
251                }));
252            }
253            TokenKind::LPAREN => {
254                self.next_token();
255                let expr = self.parse_expression(Precedence::LOWEST)?.0;
256                self.expect_peek(&TokenKind::RPAREN)?;
257                return Ok(expr);
258            }
259            TokenKind::IF => self.parse_if_expression(),
260            TokenKind::FUNCTION => self.parse_fn_expression(),
261            TokenKind::LBRACKET => {
262                let (elements, span) = self.parse_expression_list(&TokenKind::RBRACKET)?;
263                return Ok(Expression::LITERAL(Literal::Array(Array {
264                    elements,
265                    span,
266                })));
267            }
268            TokenKind::LBRACE => self.parse_hash_expression(),
269            _ => Err(format!("no prefix function for token: {}", self.current_token)),
270        }
271    }
272
273    fn parse_infix_expression(
274        &mut self,
275        left: &Expression,
276        left_start: usize,
277    ) -> Option<Result<Expression, ParseError>> {
278        match self.peek_token.kind {
279            TokenKind::PLUS
280            | TokenKind::MINUS
281            | TokenKind::ASTERISK
282            | TokenKind::SLASH
283            | TokenKind::EQ
284            | TokenKind::NotEq
285            | TokenKind::LT
286            | TokenKind::GT => {
287                self.next_token();
288                let infix_op = self.current_token.clone();
289                let precedence_value = get_token_precedence(&self.current_token.kind);
290                self.next_token();
291                let (right, span) = self.parse_expression(precedence_value).unwrap();
292                return Some(Ok(Expression::INFIX(BinaryExpression {
293                    op: infix_op,
294                    left: Box::new(left.clone()),
295                    right: Box::new(right),
296                    span: Span {
297                        start: left_start,
298                        end: span.end,
299                    },
300                })));
301            }
302            TokenKind::LPAREN => {
303                self.next_token();
304                return Some(self.parse_fn_call_expression(left.clone()));
305            }
306            TokenKind::LBRACKET => {
307                self.next_token();
308                return Some(self.parse_index_expression(left.clone()));
309            }
310            _ => None,
311        }
312    }
313
314    fn parse_if_expression(&mut self) -> Result<Expression, ParseError> {
315        let start = self.current_token.span.start;
316        self.expect_peek(&TokenKind::LPAREN)?;
317        self.next_token();
318
319        let condition = self.parse_expression(Precedence::LOWEST)?.0;
320        self.expect_peek(&TokenKind::RPAREN)?;
321        self.expect_peek(&TokenKind::LBRACE)?;
322
323        let consequent = self.parse_block_statement()?;
324
325        let alternate = if self.peek_token_is(&TokenKind::ELSE) {
326            self.next_token();
327            self.expect_peek(&TokenKind::LBRACE)?;
328            Some(self.parse_block_statement()?)
329        } else {
330            None
331        };
332
333        let end = self.current_token.span.end;
334
335        return Ok(Expression::IF(IF {
336            condition: Box::new(condition),
337            consequent,
338            alternate,
339            span: Span {
340                start,
341                end,
342            },
343        }));
344    }
345
346    fn parse_block_statement(&mut self) -> Result<BlockStatement, ParseError> {
347        let start = self.current_token.span.start;
348        self.next_token();
349        let mut block_statement = Vec::new();
350
351        while !self.current_token_is(&TokenKind::RBRACE) && !self.current_token_is(&TokenKind::EOF)
352        {
353            if let Ok(statement) = self.parse_statement() {
354                block_statement.push(statement)
355            }
356
357            self.next_token();
358        }
359
360        let end = self.current_token.span.end;
361
362        Ok(BlockStatement {
363            body: block_statement,
364            span: Span {
365                start,
366                end,
367            },
368        })
369    }
370
371    fn parse_fn_expression(&mut self) -> Result<Expression, ParseError> {
372        let start = self.current_token.span.start;
373        self.expect_peek(&TokenKind::LPAREN)?;
374
375        let params = self.parse_fn_parameters()?;
376
377        self.expect_peek(&TokenKind::LBRACE)?;
378
379        let function_body = self.parse_block_statement()?;
380
381        let end = self.current_token.span.end;
382
383        Ok(Expression::FUNCTION(FunctionDeclaration {
384            params,
385            body: function_body,
386            span: Span {
387                start,
388                end,
389            },
390            name: "".to_string(),
391        }))
392    }
393
394    fn parse_fn_parameters(&mut self) -> Result<Vec<IDENTIFIER>, ParseError> {
395        let mut params = Vec::new();
396        if self.peek_token_is(&TokenKind::RPAREN) {
397            self.next_token();
398            return Ok(params);
399        }
400
401        self.next_token();
402
403        match &self.current_token.kind {
404            TokenKind::IDENTIFIER {
405                name,
406            } => params.push(IDENTIFIER {
407                name: name.clone(),
408                span: self.current_token.span.clone(),
409            }),
410            token => {
411                return Err(format!("expected function params  to be an identifier, got {}", token))
412            }
413        }
414
415        while self.peek_token_is(&TokenKind::COMMA) {
416            self.next_token();
417            self.next_token();
418            match &self.current_token.kind {
419                TokenKind::IDENTIFIER {
420                    name,
421                } => params.push(IDENTIFIER {
422                    name: name.clone(),
423                    span: self.current_token.span.clone(),
424                }),
425                token => {
426                    return Err(format!(
427                        "expected function params  to be an identifier, got {}",
428                        token
429                    ))
430                }
431            }
432        }
433
434        self.expect_peek(&TokenKind::RPAREN)?;
435
436        return Ok(params);
437    }
438
439    fn parse_fn_call_expression(&mut self, expr: Expression) -> Result<Expression, ParseError> {
440        // fake positive
441        #[allow(unused_assignments)]
442        let mut start = self.current_token.span.start;
443        let (arguments, ..) = self.parse_expression_list(&TokenKind::RPAREN)?;
444        let end = self.current_token.span.end;
445        match &expr {
446            Expression::IDENTIFIER(i) => start = i.span.start,
447            Expression::FUNCTION(f) => start = f.span.start,
448            _ => return Err(format!("expected function")),
449        }
450        let callee = Box::new(expr);
451
452        Ok(Expression::FunctionCall(FunctionCall {
453            callee,
454            arguments,
455            span: Span {
456                start,
457                end,
458            },
459        }))
460    }
461
462    fn parse_expression_list(
463        &mut self,
464        end: &TokenKind,
465    ) -> Result<(Vec<Expression>, Span), ParseError> {
466        let start = self.current_token.span.start;
467        let mut expr_list = Vec::new();
468        if self.peek_token_is(end) {
469            self.next_token();
470            let end = self.current_token.span.end;
471            return Ok((
472                expr_list,
473                Span {
474                    start,
475                    end,
476                },
477            ));
478        }
479
480        self.next_token();
481
482        expr_list.push(self.parse_expression(Precedence::LOWEST)?.0);
483
484        while self.peek_token_is(&TokenKind::COMMA) {
485            self.next_token();
486            self.next_token();
487            expr_list.push(self.parse_expression(Precedence::LOWEST)?.0);
488        }
489
490        self.expect_peek(end)?;
491        let end = self.current_token.span.end;
492
493        return Ok((
494            expr_list,
495            Span {
496                start,
497                end,
498            },
499        ));
500    }
501
502    fn parse_index_expression(&mut self, left: Expression) -> Result<Expression, ParseError> {
503        let start = self.current_token.span.start;
504        self.next_token();
505        let index = self.parse_expression(Precedence::LOWEST)?.0;
506
507        self.expect_peek(&TokenKind::RBRACKET)?;
508
509        let end = self.current_token.span.end;
510
511        return Ok(Expression::Index(Index {
512            object: Box::new(left),
513            index: Box::new(index),
514            span: Span {
515                start,
516                end,
517            },
518        }));
519    }
520
521    fn parse_hash_expression(&mut self) -> Result<Expression, ParseError> {
522        let mut map = Vec::new();
523        let start = self.current_token.span.start;
524        while !self.peek_token_is(&TokenKind::RBRACE) {
525            self.next_token();
526
527            let key = self.parse_expression(Precedence::LOWEST)?.0;
528
529            self.expect_peek(&TokenKind::COLON)?;
530
531            self.next_token();
532            let value = self.parse_expression(Precedence::LOWEST)?.0;
533
534            map.push((key, value));
535
536            if !self.peek_token_is(&TokenKind::RBRACE) {
537                self.expect_peek(&TokenKind::COMMA)?;
538            }
539        }
540
541        self.expect_peek(&TokenKind::RBRACE)?;
542        let end = self.current_token.span.end;
543
544        Ok(Expression::LITERAL(Literal::Hash(Hash {
545            elements: map,
546            span: Span {
547                start,
548                end,
549            },
550        })))
551    }
552}
553
554pub fn parse(input: &str) -> Result<Node, ParseErrors> {
555    let lexer = Lexer::new(input);
556    let mut parser = Parser::new(lexer);
557    let program = parser.parse_program()?;
558
559    Ok(Node::Program(program))
560}
561
562pub fn parse_ast_json_string(input: &str) -> Result<String, ParseErrors> {
563    let ast = match parse(input) {
564        Ok(node) => serde_json::to_string_pretty(&node).unwrap(),
565        Err(e) => return Err(e),
566    };
567
568    return Ok(ast);
569}