From 99e462f4b5355537941dc70255054e7e09e9f275 Mon Sep 17 00:00:00 2001 From: Daniel M Date: Wed, 2 Feb 2022 14:05:58 +0100 Subject: [PATCH] Implement print keyword --- README.md | 2 +- src/interpreter.rs | 19 ++++++++++++++++--- src/lexer.rs | 5 +++++ src/parser.rs | 14 ++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8efbda1..84bc219 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ - [x] Line comments `//` - [ ] Strings - [ ] IO Intrinsics - - [ ] Print + - [x] Print - [ ] ReadLine ## Grammar diff --git a/src/interpreter.rs b/src/interpreter.rs index 2d436b9..2587939 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::{collections::HashMap, fmt::Display}; use crate::{parser::{Expression, BinOpType, UnOpType, Ast, Statement, parse}, lexer::lex}; @@ -37,8 +37,7 @@ impl Interpreter { for stmt in prog.prog { match stmt { Statement::Expr(expr) => { - let result = self.resolve_expr(expr); - println!("Result = {:?}", result); + self.resolve_expr(expr); } Statement::Loop(lop) => { @@ -55,6 +54,11 @@ impl Interpreter { } } } + + Statement::Print(expr) => { + let result = self.resolve_expr(expr); + println!("{}", result); + } } } @@ -132,6 +136,15 @@ impl Interpreter { } } +impl Display for Value { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Value::I64(val) => write!(f, "{}", val), + } + } +} + + #[cfg(test)] mod test { use super::{Interpreter, Value}; diff --git a/src/lexer.rs b/src/lexer.rs index 310af6a..f5fb1b4 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -10,8 +10,12 @@ pub enum Token { /// Identifier (name for variables, functions, ...) Ident(String), + /// Loop keyword (loop) Loop, + /// Print keyword (print) + Print, + /// Left Parenthesis ('(') LParen, @@ -199,6 +203,7 @@ impl<'a> Lexer<'a> { let token = match ident.as_str() { "loop" => Token::Loop, + "print" => Token::Print, _ => Token::Ident(ident), }; diff --git a/src/parser.rs b/src/parser.rs index 9257ed1..244e564 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -95,6 +95,7 @@ pub struct Loop { pub enum Statement { Expr(Expression), Loop(Loop), + Print(Expression), } #[derive(Debug, PartialEq, Eq, Clone)] @@ -142,6 +143,19 @@ impl> Parser { match self.peek() { Token::Loop => Statement::Loop(self.parse_loop()), + Token::Print => { + self.next(); + + let expr = self.parse_expr(); + + // After a statement, there must be a semicolon + if !matches!(self.next(), Token::Semicolon) { + panic!("Expected semicolon after statement"); + } + + Statement::Print(expr) + } + // If it is not a loop, try to lex as an expression _ => { let stmt = Statement::Expr(self.parse_expr());