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 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 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 #[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}