From 45186e3803d788fafb81a86e21f832d0443f2604 Mon Sep 17 00:00:00 2001 From: Dummi26 Date: Fri, 24 Mar 2023 14:57:42 +0100 Subject: [PATCH] parser bugfix, started working on external libraries (libraries can register functions and react to function calls via stdout/stdin) --- src/libs/mod.rs | 36 ++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + src/parse/parse.rs | 7 +++++-- src/script/val_type.rs | 2 ++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/libs/mod.rs diff --git a/src/libs/mod.rs b/src/libs/mod.rs new file mode 100644 index 0000000..f4a6baf --- /dev/null +++ b/src/libs/mod.rs @@ -0,0 +1,36 @@ +use std::{ + io, + process::{Child, ChildStdin, ChildStdout, Command}, +}; + +pub struct Lib { + process: Child, + stdin: ChildStdin, + stdout: ChildStdout, +} +impl Lib { + pub fn launch(mut exec: Command) -> Result { + let mut handle = match exec.spawn() { + Ok(v) => v, + Err(e) => return Err(LaunchError::CouldNotSpawnProcess(e)), + }; + if let (Some(stdin), Some(stdout), stderr) = ( + handle.stdin.take(), + handle.stdout.take(), + handle.stderr.take(), + ) { + Ok(Self { + process: handle, + stdin, + stdout, + }) + } else { + return Err(LaunchError::NoStdio); + } + } +} + +pub enum LaunchError { + NoStdio, + CouldNotSpawnProcess(io::Error), +} diff --git a/src/main.rs b/src/main.rs index 16de734..5f39c90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use std::time::Instant; +pub(crate) mod libs; pub(crate) mod parse; pub(crate) mod script; diff --git a/src/parse/parse.rs b/src/parse/parse.rs index 1066d62..a0cc0e5 100644 --- a/src/parse/parse.rs +++ b/src/parse/parse.rs @@ -93,9 +93,12 @@ fn parse_block_advanced( _ => (), } statements.push(parse_statement(file)?); - match file.get_char(file.get_char_index().saturating_sub(1)) { + match file.peek() { // Some('}') if treat_closed_block_bracket_as_closing_delimeter => break, - Some(')') if treat_closed_normal_bracket_as_closing_delimeter => break, + Some(')') if treat_closed_normal_bracket_as_closing_delimeter => { + file.next(); + break; + } _ => (), } if single_statement && !statements.is_empty() { diff --git a/src/script/val_type.rs b/src/script/val_type.rs index 3d14b21..09d1baf 100644 --- a/src/script/val_type.rs +++ b/src/script/val_type.rs @@ -131,6 +131,8 @@ impl VSingleType { types } Self::List(v) => v.types.clone(), + // NOTE: to make ints work in for loops + Self::Int => vec![Self::Int], _ => vec![], } }