From 21477ce6ee993cc7b4ac326de6c520cc311d22b9 Mon Sep 17 00:00:00 2001 From: Davirain Date: Fri, 31 May 2024 11:24:50 +0800 Subject: [PATCH] use tracing replace log --- Cargo.lock | 321 ++++++++++++++-------------------- Cargo.toml | 4 +- src/ast/expression/boolean.rs | 3 +- src/ast/mod.rs | 11 +- src/ast/statement/block.rs | 7 +- src/evaluator/mod.rs | 21 +-- src/main.rs | 2 +- src/object/environment.rs | 16 +- src/parser/mod.rs | 48 ++--- src/repl/mod.rs | 3 +- src/token/mod.rs | 8 +- 11 files changed, 201 insertions(+), 243 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 250fadb..9900c5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - [[package]] name = "anyhow" version = "1.0.75" @@ -29,12 +20,6 @@ version = "3.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" -[[package]] -name = "cc" -version = "1.0.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" - [[package]] name = "cfg-if" version = "0.1.10" @@ -56,40 +41,6 @@ dependencies = [ "bitflags", ] -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "global" version = "0.4.3" @@ -99,43 +50,6 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "io-lifetimes" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "is-terminal" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" -dependencies = [ - "hermit-abi", - "io-lifetimes", - "rustix", - "windows-sys", -] - [[package]] name = "js-sys" version = "0.3.60" @@ -157,12 +71,6 @@ version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - [[package]] name = "lock_api" version = "0.3.4" @@ -178,6 +86,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -206,12 +123,28 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.9.0" @@ -234,10 +167,16 @@ dependencies = [ "libc", "redox_syscall", "rustc_version", - "smallvec", + "smallvec 0.6.14", "winapi", ] +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + [[package]] name = "proc-macro2" version = "1.0.69" @@ -268,8 +207,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ - "aho-corasick", - "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ "regex-syntax", ] @@ -288,20 +234,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.36.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "scopeguard" version = "1.1.0" @@ -323,6 +255,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "smallvec" version = "0.6.14" @@ -332,17 +273,23 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + [[package]] name = "star-kirby-lang" version = "0.1.1" dependencies = [ "anyhow", - "env_logger", "global", "lazy_static", - "log", "nom", "thiserror", + "tracing", + "tracing-subscriber", "whoami", ] @@ -368,15 +315,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "1.0.50" @@ -397,12 +335,89 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec 1.13.2", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "unicode-ident" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "wasm-bindgen" version = "0.2.83" @@ -493,74 +508,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/Cargo.toml b/Cargo.toml index 17dfce5..4261579 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,11 +6,11 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -log = "0.4.20" lazy_static = "1.4.0" whoami = "1.4.1" anyhow = "1.0.75" -env_logger = "0.10.0" global = "0.4.3" thiserror = "1.0.50" nom = "7.1.3" +tracing = "0.1.40" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } diff --git a/src/ast/expression/boolean.rs b/src/ast/expression/boolean.rs index c504a25..e6704b9 100644 --- a/src/ast/expression/boolean.rs +++ b/src/ast/expression/boolean.rs @@ -2,7 +2,6 @@ use crate::ast::expression::Expression; use crate::ast::NodeInterface; use crate::error::Error; use crate::token::Token; -use log::trace; use std::fmt::{Display, Formatter}; #[derive(Debug, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] @@ -52,7 +51,7 @@ impl TryFrom for Boolean { value: value.value.parse()?, }), unknow => { - trace!("[try_from] Expression is ({unknow})"); + tracing::error!("[try_from] Expression is ({unknow})"); Err(Error::UnknownExpression(unknow.to_string()).into()) } } diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 9e08280..b97ee25 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -12,7 +12,6 @@ use crate::object::environment::Environment; use crate::object::Object; use crate::token::Token; -use log::trace; use std::fmt::{Debug, Display, Formatter}; #[derive(Debug, Clone, PartialOrd, PartialEq, Eq, Ord, Hash)] @@ -124,8 +123,8 @@ impl Program { self.statements.len() } + #[tracing::instrument(level = "trace", name = "eval_program", skip(self, env))] pub fn eval_program(&self, env: &mut Environment) -> anyhow::Result { - trace!("[eval_program] program is ({self})"); let null = crate::object::null::Null; let mut result: Object = null.into(); @@ -135,7 +134,7 @@ impl Program { match result { Object::ReturnValue(value) => { - trace!("[eval_statement] ReturnValue is ({value:?})"); + tracing::error!("[eval_statement] ReturnValue is ({value:?})"); return Ok(value.value().clone()); } _ => continue, @@ -208,9 +207,9 @@ impl TryFrom for Identifier { token: value.token().clone(), value: value.value().to_string(), }), - _ => { - trace!("Expression: {value}"); - unimplemented!() + v => { + tracing::error!("Expression: {v}"); + Err(anyhow::anyhow!("Expression({}) is not Identifier", v)) } } } diff --git a/src/ast/statement/block.rs b/src/ast/statement/block.rs index 0145494..f1de780 100644 --- a/src/ast/statement/block.rs +++ b/src/ast/statement/block.rs @@ -7,7 +7,6 @@ use crate::object::Object; use crate::object::ObjectInterface; use crate::object::ObjectType; use crate::token::Token; -use log::trace; use std::fmt::{Debug, Display, Formatter}; #[derive(Debug, Clone, Default, Hash, Eq, PartialEq, Ord, PartialOrd)] @@ -36,16 +35,16 @@ impl BlockStatement { &self.statements } + #[tracing::instrument(name = "eval_block_statement", skip(self),fields(env = %env))] pub fn eval_block_statement(&self, env: &mut Environment) -> anyhow::Result { - trace!("[eval_block_statement] BlockStatement is ({})", self); let mut result: Object = Null.into(); for statement in self.statements.clone().into_iter() { - trace!("[eval_block_statement] statement is ({:#?})", statement); + tracing::trace!("[eval_block_statement] statement is ({:#?})", statement); let node: Node = statement.into(); result = node.eval(env)?; - trace!("[eval_block_statement] result is ({:?})", result); + tracing::trace!("[eval_block_statement] result is ({:?})", result); match result.clone() { Object::ReturnValue(value) => { if value.object_type() == ObjectType::Return { diff --git a/src/evaluator/mod.rs b/src/evaluator/mod.rs index ffaec5e..51dae54 100644 --- a/src/evaluator/mod.rs +++ b/src/evaluator/mod.rs @@ -19,7 +19,6 @@ use crate::object::return_value::ReturnValue; use crate::object::string::StringObj; use crate::object::ObjectType; use crate::object::{Object, ObjectInterface}; -use log::trace; use std::collections::BTreeMap; pub mod builtins; @@ -118,20 +117,17 @@ impl Node { } } +#[tracing::instrument(level = "trace", skip(env))] fn eval_expressions(exps: &[Expression], env: &mut Environment) -> anyhow::Result> { - trace!("[eval_expressions] start"); - let mut result = vec![]; for e in exps { let node = Node::from(e); let evaluated = node.eval(env)?; - trace!("[eval_expressions] evaluated is = {:?}", evaluated); + tracing::trace!("[eval_expressions] evaluated is = {:?}", evaluated); result.push(evaluated); } - trace!("[eval_expressions] end"); - Ok(result) } @@ -268,12 +264,8 @@ impl Object { Ok(pair.unwrap().clone()) } + #[tracing::instrument(name = "eval_index_expression", skip(self), fields(index = %index))] pub fn eval_index_expression(&self, index: Object) -> anyhow::Result { - trace!( - "[eval_index_expression]: left = {:?}, index = {:?}", - self, - index - ); if self.object_type() == ObjectType::Array && index.object_type() == ObjectType::Integer { self.eval_array_index_expression(index) } else if self.object_type() == ObjectType::Hash { @@ -338,17 +330,18 @@ impl Object { } } + #[tracing::instrument(name = "apply_function", skip(self), fields(self = ?self, args = ?args))] pub fn apply_function(&self, args: Vec) -> anyhow::Result { match self.clone() { Object::Function(fn_value) => { - trace!("[apply_function] function is {:#?}", fn_value); + tracing::trace!("[apply_function] function is {:#?}", fn_value); let mut extend_env = fn_value.extend_function_env(args); - trace!("[apply_function] extend_env is {:?}", extend_env); + tracing::trace!("[apply_function] extend_env is {:?}", extend_env); let fn_value: Node = fn_value.body().clone().into(); let evaluated = fn_value.eval(&mut extend_env)?; - trace!("[apply_function] call function result is {}", evaluated); + tracing::trace!("[apply_function] call function result is {}", evaluated); Ok(evaluated) } diff --git a/src/main.rs b/src/main.rs index 62da4bf..58011ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ pub mod repl; pub mod token; fn main() -> anyhow::Result<()> { - env_logger::init(); + tracing_subscriber::fmt::init(); println!( "Hello {}! This is the Monkey programming language!", whoami::username() diff --git a/src/object/environment.rs b/src/object/environment.rs index 5887aec..58435e5 100644 --- a/src/object/environment.rs +++ b/src/object/environment.rs @@ -1,5 +1,5 @@ use crate::object::Object; -use std::collections::BTreeMap; +use std::{collections::BTreeMap, fmt::Display}; #[derive(Debug, Clone, PartialOrd, PartialEq, Eq, Ord, Hash)] pub struct Environment { @@ -13,6 +13,20 @@ impl Default for Environment { } } +impl Display for Environment { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (key, value) in self.store.iter() { + writeln!(f, "{}: {}", key, value)?; + } + writeln!(f, "")?; + if self.outer.is_some() { + write!(f, "{}", self.outer.as_ref().unwrap()) + } else { + write!(f, "") + } + } +} + impl Environment { pub fn new() -> Self { Self { diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 0fbfafa..71c8585 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -27,7 +27,6 @@ use crate::parser::operator_priority::OperatorPriority::{LOWEST, PREFIX}; use crate::token::token_type::TokenType; use crate::token::token_type::TokenType::{COLON, COMMA, RBRACE, RBRACKET}; use crate::token::Token; -use log::trace; use std::collections::HashMap; /// 前缀解析函数 @@ -123,8 +122,9 @@ impl<'a> Parser<'a> { Ok(()) } + #[tracing::instrument(name = "parse_identifier", skip(self))] pub fn parse_program(&mut self) -> anyhow::Result { - trace!("[parse_program] current_token = {:?}", self.current_token); + tracing::trace!("[parse_program] current_token = {:?}", self.current_token); let mut program = Program::new(); // Now fix this to EOF @@ -138,7 +138,7 @@ impl<'a> Parser<'a> { } fn parse_statement(&mut self) -> anyhow::Result { - trace!("[parse_statement] current_token = {:?}", self.current_token); + tracing::trace!("[parse_statement] current_token = {:?}", self.current_token); match self.current_token.token_type() { TokenType::LET => Ok(self.parse_let_statement()?.into()), TokenType::RETURN => Ok(self.parse_return_statement()?.into()), @@ -158,13 +158,13 @@ impl<'a> Parser<'a> { /// /// # 解析let 语句 fn parse_let_statement(&mut self) -> anyhow::Result { - trace!( + tracing::trace!( "[parse_let_statement] current_token = {:?}", self.current_token ); let mut stmt = LetStatement::new(self.current_token.clone()); - trace!("[parse_let_statement] stmt = {stmt}"); + tracing::trace!("[parse_let_statement] stmt = {stmt}"); if self.expect_peek(TokenType::IDENT).is_err() { return Err(Error::CannotFindTokenType { ty: "IDENT".into() }.into()); @@ -174,7 +174,7 @@ impl<'a> Parser<'a> { self.current_token.clone(), self.current_token.literal().into(), ); - trace!("[parse_let_statement] stmt = {stmt}"); + tracing::trace!("[parse_let_statement] stmt = {stmt}"); if self.expect_peek(TokenType::ASSIGN).is_err() { return Err(Error::CannotFindTokenType { @@ -191,14 +191,14 @@ impl<'a> Parser<'a> { self.next_token()?; } - trace!("stmt = {stmt}"); + tracing::trace!("stmt = {stmt}"); Ok(stmt) } /// 解析return 语句 fn parse_return_statement(&mut self) -> anyhow::Result { - trace!( + tracing::trace!( "[parse_return_statement] current_token = {:?}", self.current_token ); @@ -220,13 +220,13 @@ impl<'a> Parser<'a> { /// 这是因为表达式语句不是真正的语句,而是仅由表达式构成的语句,相当于一层封装 fn parse_expression_statement(&mut self) -> anyhow::Result { // un_trace(trace("parseExpressionStatement".into())); - trace!( + tracing::trace!( "[parse_expression_statement] current_token = {:?}", self.current_token ); let mut stmt = ExpressionStatement::new(self.current_token.clone()); - trace!("[parse_expression_statement] >> before ExpressionStatement = {stmt}"); + tracing::trace!("[parse_expression_statement] >> before ExpressionStatement = {stmt}"); *stmt.expression_mut() = self.parse_expression(LOWEST)?; @@ -234,14 +234,14 @@ impl<'a> Parser<'a> { self.next_token()?; } - trace!("[parse_expression_statement] >> after ExpressionStatement = {stmt}"); + tracing::trace!("[parse_expression_statement] >> after ExpressionStatement = {stmt}"); Ok(stmt) } /// parse expression fn parse_expression(&mut self, precedence: OperatorPriority) -> anyhow::Result { - trace!( + tracing::trace!( "[parse_expression] current_token = {:?}", self.current_token ); @@ -267,10 +267,10 @@ impl<'a> Parser<'a> { // TODO 因为使用 PrefixParseFn 和InferParseFn 的原因,其中的第一个参数是parser self.update_parser(parser); // TODO 因为使用 PrefixParseFn 和InferParseFn 的原因,其中的第一个参数是parser - trace!("[parse_expression] left expression = {left_exp:?}"); + tracing::trace!("[parse_expression] left expression = {left_exp:?}"); while !self.peek_token_is(TokenType::SEMICOLON) && precedence < self.peek_precedence() { - trace!("[parse_expression] peek_token = {:?}", self.peek_token); + tracing::trace!("[parse_expression] peek_token = {:?}", self.peek_token); let infix = temp_infix_parse_fns.get(self.peek_token.token_type()); if infix.is_none() { return Ok(left_exp); @@ -292,7 +292,7 @@ impl<'a> Parser<'a> { self.update_parser(parser); } - trace!( + tracing::trace!( "[parse_expression] end current_token = {:?}", self.current_token ); @@ -359,7 +359,7 @@ impl<'a> Parser<'a> { self.current_token.literal().into(), ); - trace!("[parse_infix_expression] before InfixExpression = {expression}"); + tracing::trace!("[parse_infix_expression] before InfixExpression = {expression}"); let precedence = self.cur_precedence(); @@ -367,7 +367,7 @@ impl<'a> Parser<'a> { *expression.right_mut() = Box::new(self.parse_expression(precedence)?); - trace!("[parse_infix_expression] after InfixExpression = {expression}"); + tracing::trace!("[parse_infix_expression] after InfixExpression = {expression}"); Ok(expression.into()) } @@ -478,7 +478,7 @@ impl<'a> Parser<'a> { self.next_token()?; return Ok(identifiers); } - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); @@ -492,22 +492,22 @@ impl<'a> Parser<'a> { identifiers.push(ident); - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); while self.peek_token_is(TokenType::COMMA) { - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); self.next_token()?; // skip one ident - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); self.next_token()?; // skip one `,` - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); @@ -518,13 +518,13 @@ impl<'a> Parser<'a> { identifiers.push(ident); } - trace!( + tracing::trace!( "[parser function parameters ] current_token {:?}", self.current_token ); if self.expect_peek(TokenType::RPAREN).is_err() { - trace!( + tracing::trace!( "[parser function parameters ] expect_peek {}", self.peek_token.token_type() ); diff --git a/src/repl/mod.rs b/src/repl/mod.rs index c5f22e9..396ddb2 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -3,7 +3,6 @@ use crate::lexer::lexer; use crate::object::environment::Environment; use crate::object::ObjectInterface; use crate::parser::Parser; -use log::trace; use std::io; use std::io::BufRead; use std::io::Write; @@ -70,7 +69,7 @@ pub fn start(std_in: io::Stdin, mut std_out: io::Stdout) -> anyhow::Result<()> { let _ = std_out.flush(); } Err(error) => { - trace!("{error}"); + tracing::error!("{error}"); continue; } } diff --git a/src/token/mod.rs b/src/token/mod.rs index eb7c4ad..04f9ea2 100644 --- a/src/token/mod.rs +++ b/src/token/mod.rs @@ -1,6 +1,6 @@ pub mod token_type; - use crate::token::token_type::TokenType; +use std::fmt::{Display, Formatter}; #[derive(Debug, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] pub struct Token { @@ -10,6 +10,12 @@ pub struct Token { literal: String, } +impl Display for Token { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "Token({}, {})", self.token_type, self.literal) + } +} + impl Token { pub fn new(token_type: TokenType, ch: char) -> Self { Self::from_char(token_type, ch)