Mise en place du visiteur et ébauche de pretty printer.

This commit is contained in:
2024-04-30 08:29:16 +02:00
parent 0103749edd
commit 257f31276f
2 changed files with 56 additions and 9 deletions

View File

@@ -1,13 +1,13 @@
use crate::token::Token; use crate::token::Token;
pub struct Binary { pub struct Binary {
left: Expr, left: Box<Expr>,
operator: Token, operator: Token,
right: Expr, right: Box<Expr>,
} }
pub struct Grouping { pub struct Grouping {
expression: Expr, expression: Box<Expr>,
} }
pub enum Literal { pub enum Literal {
@@ -19,12 +19,58 @@ pub enum Literal {
pub struct Unary { pub struct Unary {
operator: Token, operator: Token,
right: Expr, right: Box<Expr>,
} }
pub enum Expr { pub enum Expr {
Binary , BinaryExpr(Binary),
Grouping, GroupingExpr(Grouping),
Literal, LiteralExpr(Literal),
Unary, 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();
}
} }

View File

@@ -1,6 +1,6 @@
use std::env; use std::env;
//use std::io::Write;
use std::process; use std::process;
use crate::expr::Expr;
mod rlox_interpreter; mod rlox_interpreter;
mod scanner; mod scanner;
@@ -31,6 +31,7 @@ fn main() {
} }
// Implémentations de référence : // Implémentations de référence :
// https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust // https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust