From 257f31276f50556845183fff4fc93e54b0c7e533 Mon Sep 17 00:00:00 2001 From: Emmanuel BERNAT Date: Tue, 30 Apr 2024 08:29:16 +0200 Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20du=20visiteur=20et=20=C3=A9?= =?UTF-8?q?bauche=20de=20pretty=20printer.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/expr.rs | 62 ++++++++++++++++++++++++++++++++++++++++++++++------- src/main.rs | 3 ++- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/expr.rs b/src/expr.rs index 47143b9..65b80c1 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -1,13 +1,13 @@ use crate::token::Token; pub struct Binary { - left: Expr, + left: Box, operator: Token, - right: Expr, + right: Box, } pub struct Grouping { - expression: Expr, + expression: Box, } pub enum Literal { @@ -19,12 +19,58 @@ pub enum Literal { pub struct Unary { operator: Token, - right: Expr, + right: Box, } pub enum Expr { - Binary , - Grouping, - Literal, - Unary, + BinaryExpr(Binary), + GroupingExpr(Grouping), + LiteralExpr(Literal), + UnaryExpr(Unary), +} + +pub trait Visitor { + fn visit(&self); +} + +impl Visitor for Binary { + fn visit(&self) { + print!("( {}",&self.operator.literal); + &self.left.visit(); + &self.right.visit(); + print!(")"); + } +} + +impl Visitor for Grouping { + fn visit(&self) { + print!("( group "); + &self.expression.visit(); + print!(")"); + } +} + +impl Visitor for Literal { + fn visit(&self) { + match &self { + Literal::LiteralNumber(i) => print!("{}", i), + Literal::LiteralString(s) => print!("{}", s), + Literal::LiteralBool(b) => print!("{}", b), + Literal::LiteralNil => print!("nil"), + } + } +} + +impl Visitor for Unary { + fn visit(&self) { + print!("( {}",&self.operator.literal); + &self.right.visit(); + print!(")"); + } +} + +impl Visitor for Expr { + fn visit(&self) { + &self.visit(); + } } diff --git a/src/main.rs b/src/main.rs index 398de11..b97d31f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use std::env; -//use std::io::Write; use std::process; +use crate::expr::Expr; mod rlox_interpreter; mod scanner; @@ -31,6 +31,7 @@ fn main() { } + // Implémentations de référence : // https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust