From b7d152be9179022aaee501a553c8391ce500f5d3 Mon Sep 17 00:00:00 2001 From: Jeff Date: Mon, 19 Feb 2024 17:00:33 -0500 Subject: [PATCH] Write docs; Update logging and error messages --- README.md | 37 ++++++++++++++- docs/assets/debugging.png | Bin 0 -> 33726 bytes docs/assets/syntax_error.png | Bin 0 -> 21307 bytes docs/assets/type_error.png | Bin 0 -> 13912 bytes src/abstract_tree/assignment.rs | 4 ++ src/abstract_tree/logic.rs | 5 ++ src/abstract_tree/logic_operator.rs | 17 +++++++ src/abstract_tree/math_operator.rs | 2 + src/abstract_tree/value_node.rs | 2 +- src/abstract_tree/while.rs | 6 +++ src/context/mod.rs | 4 -- src/error/syntax_error.rs | 70 ++++++++++++++++++++-------- src/error/validation_error.rs | 12 ++++- 13 files changed, 132 insertions(+), 27 deletions(-) create mode 100644 docs/assets/debugging.png create mode 100644 docs/assets/syntax_error.png create mode 100644 docs/assets/type_error.png diff --git a/README.md b/README.md index 215aad6..c4f46e8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Dust -High-level programming language with effortless concurrency, automatic memory management and first class functions. +High-level programming language with effortless concurrency, automatic memory management, type safety and strict error handling. ![Dust version of an example from The Rust Programming Language.](https://git.jeffa.io/jeff/dust/docs/assets/example_0.png) @@ -8,6 +8,7 @@ High-level programming language with effortless concurrency, automatic memory ma - [Dust](#dust) - [Easy to Read and Write](#easy-to-read-and-write) - [Effortless Concurrency](#effortless-concurrency) + - [Helpful Errors](#helpful-errors) - [Debugging](#debugging) - [Automatic Memory Management](#automatic-memory-management) - [Installation and Usage](#installation-and-usage) @@ -15,10 +16,44 @@ High-level programming language with effortless concurrency, automatic memory ma ## Easy to Read and Write +Dust has simple, easy-to-learn syntax. + +```js +output('Hello world!') +``` + ## Effortless Concurrency +Write multi-threaded code as easily as you would write code for a single thread. + +```js +async { + output('Will this one print first?') + output('Or will this one?') + output('Who knows! Each "output" will run in its own thread!') +} +``` + +## Helpful Errors + +Dust shows you exactly where your code went wrong and suggests changes. + +![Example of syntax error output.](https://git.jeffa.io/jeff/dust/docs/assets/syntax_error.png) + +## Static analysis + +Your code is always validated for safety before it is run. Other interpreted languages can fail halfway through, but Dust is able to avoid runtime errors by analyzing the program *before* it is run + +![Example of type error output.](https://git.jeffa.io/jeff/dust/docs/assets/type_error.png) + ## Debugging +Just set the environment variable `DUST_LOG=info` and Dust will tell you exactly what your code is doing while it's doing it. If you set `DUST_LOG=trace`, it will output detailed logs about parsing, abstraction, validation, memory management and runtime. + +![Example of debug output.](https://git.jeffa.io/jeff/dust/docs/assets/debugging.png) + ## Automatic Memory Management +## Error Handling + ## Installation and Usage diff --git a/docs/assets/debugging.png b/docs/assets/debugging.png new file mode 100644 index 0000000000000000000000000000000000000000..b4bb53be6e3305e544170153863fbac8529f803f GIT binary patch literal 33726 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 b!EK!{TP@2m-M3|c6dx<|sgp8Ioj3e1uI?Js literal 0 HcmV?d00001 diff --git a/docs/assets/syntax_error.png b/docs/assets/syntax_error.png new file mode 100644 index 0000000000000000000000000000000000000000..5e995c0906d77aad333f8dbcee4f12f5efc999ff GIT binary patch literal 21307 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 literal 0 HcmV?d00001 diff --git a/docs/assets/type_error.png b/docs/assets/type_error.png new file mode 100644 index 0000000000000000000000000000000000000000..01400cbe352e50a182b9c08f0ef115f65523da0e GIT binary patch literal 13912 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 ZM2KNR-nM-X|9cCed{<3A=Z?{fe**?CAl?7~ literal 0 HcmV?d00001 diff --git a/src/abstract_tree/assignment.rs b/src/abstract_tree/assignment.rs index 0a09c95..2edb2a3 100644 --- a/src/abstract_tree/assignment.rs +++ b/src/abstract_tree/assignment.rs @@ -60,6 +60,8 @@ impl AbstractTree for Assignment { self.statement.expected_type(context)? }; + log::info!("Setting type: {} <{}>", self.identifier, r#type); + context.set_type(self.identifier.clone(), r#type)?; } @@ -155,6 +157,8 @@ impl AbstractTree for Assignment { .set_value(self.identifier.clone(), new_value.clone())?; } + log::info!("RUN assignment: {} = {}", self.identifier, new_value); + context.set_value(self.identifier.clone(), new_value)?; Ok(Value::none()) diff --git a/src/abstract_tree/logic.rs b/src/abstract_tree/logic.rs index 5c7777c..5cf33ba 100644 --- a/src/abstract_tree/logic.rs +++ b/src/abstract_tree/logic.rs @@ -45,6 +45,8 @@ impl AbstractTree for Logic { } fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { + log::info!("VALIDATE logic expression"); + self.left.validate(_source, _context)?; self.right.validate(_source, _context) } @@ -52,6 +54,9 @@ impl AbstractTree for Logic { fn run(&self, source: &str, context: &Context) -> Result { let left = self.left.run(source, context)?; let right = self.right.run(source, context)?; + + log::info!("RUN logic expression: {left} {} {right}", self.operator); + let result = match self.operator { LogicOperator::Equal => { if let (Ok(left_num), Ok(right_num)) = (left.as_number(), right.as_number()) { diff --git a/src/abstract_tree/logic_operator.rs b/src/abstract_tree/logic_operator.rs index b271142..3865f05 100644 --- a/src/abstract_tree/logic_operator.rs +++ b/src/abstract_tree/logic_operator.rs @@ -1,3 +1,5 @@ +use std::fmt::{self, Display, Formatter}; + use serde::{Deserialize, Serialize}; use crate::{ @@ -74,3 +76,18 @@ impl Format for LogicOperator { } } } + +impl Display for LogicOperator { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + match self { + LogicOperator::Equal => write!(f, "="), + LogicOperator::NotEqual => write!(f, "!="), + LogicOperator::And => write!(f, "&&"), + LogicOperator::Or => write!(f, "||"), + LogicOperator::Greater => write!(f, ">"), + LogicOperator::Less => write!(f, "<"), + LogicOperator::GreaterOrEqual => write!(f, ">="), + LogicOperator::LessOrEqual => write!(f, "<="), + } + } +} diff --git a/src/abstract_tree/math_operator.rs b/src/abstract_tree/math_operator.rs index 2d6f1d1..3b7ad3a 100644 --- a/src/abstract_tree/math_operator.rs +++ b/src/abstract_tree/math_operator.rs @@ -20,6 +20,8 @@ impl AbstractTree for MathOperator { _source: &str, _context: &Context, ) -> Result { + SyntaxError::expect_syntax_node("math_operator", node)?; + let operator_node = node.child(0).unwrap(); let operator = match operator_node.kind() { "+" => MathOperator::Add, diff --git a/src/abstract_tree/value_node.rs b/src/abstract_tree/value_node.rs index 843b334..6693b63 100644 --- a/src/abstract_tree/value_node.rs +++ b/src/abstract_tree/value_node.rs @@ -179,7 +179,7 @@ impl AbstractTree for ValueNode { } } ValueNode::Map(map_node) => map_node.validate(_source, context)?, - ValueNode::Enum { name, variant, expression } => { + ValueNode::Enum { name, expression, .. } => { name.validate(_source, context)?; if let Some(expression) = expression { diff --git a/src/abstract_tree/while.rs b/src/abstract_tree/while.rs index 07ba81c..a604a02 100644 --- a/src/abstract_tree/while.rs +++ b/src/abstract_tree/while.rs @@ -32,15 +32,21 @@ impl AbstractTree for While { } fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { + log::info!("VALIDATE while loop"); + self.expression.validate(_source, context)?; self.block.validate(_source, context) } fn run(&self, source: &str, context: &Context) -> Result { + log::info!("RUN while loop start"); + while self.expression.run(source, context)?.as_boolean()? { self.block.run(source, context)?; } + log::info!("RUN while loop end"); + Ok(Value::none()) } } diff --git a/src/context/mod.rs b/src/context/mod.rs index 07fee6c..ef94cd7 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -264,8 +264,6 @@ impl Context { /// Set a value to a key. pub fn set_value(&self, key: Identifier, value: Value) -> Result<(), RwLockError> { - log::info!("Setting value: {key} = {value}"); - let mut map = self.inner.write()?; let old_data = map.remove(&key); @@ -283,8 +281,6 @@ impl Context { /// This allows the interpreter to check a value's type before the value /// actually exists by predicting what the abstract tree will produce. pub fn set_type(&self, key: Identifier, r#type: Type) -> Result<(), RwLockError> { - log::info!("Setting type: {key} <{}>", r#type); - self.inner .write()? .insert(key, (ValueData::TypeHint(r#type), UsageCounter::new())); diff --git a/src/error/syntax_error.rs b/src/error/syntax_error.rs index 27038cc..c2bed44 100644 --- a/src/error/syntax_error.rs +++ b/src/error/syntax_error.rs @@ -1,5 +1,6 @@ use std::fmt::{self, Display, Formatter}; +use colored::Colorize; use lyneate::Report; use serde::{Deserialize, Serialize}; use tree_sitter::Node as SyntaxNode; @@ -12,6 +13,8 @@ use super::rw_lock_error::RwLockError; pub enum SyntaxError { /// Invalid user input. InvalidSource { + expected: String, + actual: String, position: SourcePosition, }, @@ -27,25 +30,25 @@ pub enum SyntaxError { impl SyntaxError { pub fn create_report(&self, source: &str) -> String { let messages = match self { - SyntaxError::InvalidSource { position } => { + SyntaxError::InvalidSource { position, .. } => self + .to_string() + .split_inclusive(".") + .map(|message_part| { + ( + position.start_byte..position.end_byte, + message_part.to_string(), + (255, 200, 100), + ) + }) + .collect(), + SyntaxError::RwLock(_) => todo!(), + SyntaxError::UnexpectedSyntaxNode { position, .. } => { vec![( position.start_byte..position.end_byte, - format!( - "Invalid syntax from ({}, {}) to ({}, {}).", - position.start_row, - position.start_column, - position.end_row, - position.end_column, - ), + self.to_string(), (255, 200, 100), )] } - SyntaxError::RwLock(_) => todo!(), - SyntaxError::UnexpectedSyntaxNode { - expected: _, - actual: _, - position: _, - } => todo!(), }; Report::new_byte_spanned(source, messages).display_str() @@ -58,6 +61,8 @@ impl SyntaxError { Ok(()) } else if actual.is_error() { Err(SyntaxError::InvalidSource { + expected: expected.to_owned(), + actual: actual.kind().to_string(), position: SourcePosition::from(actual.range()), }) } else { @@ -79,16 +84,43 @@ impl From for SyntaxError { impl Display for SyntaxError { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match self { - SyntaxError::InvalidSource { position } => write!(f, "Invalid syntax at {position:?}."), + SyntaxError::InvalidSource { + expected, + actual, + position, + } => { + let actual = if actual == "ERROR" { + "unrecognized characters" + } else { + actual + }; + + write!( + f, + "Invalid syntax from ({}, {}) to ({}, {}). Exected {} but found {}.", + position.start_row, + position.start_column, + position.end_row, + position.end_column, + expected.bold().green(), + actual.bold().red(), + ) + } SyntaxError::RwLock(_) => todo!(), SyntaxError::UnexpectedSyntaxNode { expected, actual, position, - } => write!( - f, - "Unexpected syntax node. Expected {expected} but got {actual} at {position:?}." - ), + } => { + write!( + f, + "Interpreter Error. Tried to parse {actual} as {expected} from ({}, {}) to ({}, {}).", + position.start_row, + position.start_column, + position.end_row, + position.end_column, + ) + } } } } diff --git a/src/error/validation_error.rs b/src/error/validation_error.rs index 88e92aa..3b18a28 100644 --- a/src/error/validation_error.rs +++ b/src/error/validation_error.rs @@ -1,5 +1,6 @@ use std::fmt::{self, Display, Formatter}; +use colored::Colorize; use lyneate::Report; use serde::{Deserialize, Serialize}; @@ -223,10 +224,17 @@ impl ValidationError { position, } => vec![( position.start_byte..position.end_byte, - format!("Type {actual} is incompatible with {expected}."), + format!( + "Type {} is incompatible with {}.", + actual.to_string().bold().red(), + expected.to_string().bold().green() + ), (200, 200, 200), )], - ValidationError::TypeCheckExpectedFunction { actual: _, position: _ } => todo!(), + ValidationError::TypeCheckExpectedFunction { + actual: _, + position: _, + } => todo!(), ValidationError::VariableIdentifierNotFound(_) => todo!(), ValidationError::TypeDefinitionNotFound(_) => todo!(), ValidationError::ExpectedEnumDefintion { actual: _ } => todo!(),