multithread + some fixes

This commit is contained in:
MeexReay 2024-07-29 01:48:32 +03:00
parent e2b6b5a0dc
commit 39d090baa4
8 changed files with 511 additions and 45 deletions

View File

@ -125,6 +125,8 @@ DROP_VAR text # дропнуть переменную
| `ADD_STR` | `str_var`, `value_var` | Прибавить к строке `str_var` значение `value_var` (может быть типа `string/char/list[char]`) |
| `SUB_STR` | `str_var`, `start_index`, `end_index` | Сделать подстроку из строки `str_var` и сохранить туда же |
| `SUB_LIST` | `list_var`, `start_index`, `end_index` | Сделать подсписок из списка `list_var` и сохранить туда же |
| `NONE_OPTIONAL` | `var` | Установить пустой `optional` в `var` |
| `PACK_OPTIONAL` | `var`, `result_var` | Упаковать `var` в `optional` и установить в `result_var` |
| `UNPACK_OPTIONAL` | `optional_var`, `result_var` | Достать данные из `optional_var` и установить в `result_var` |
| `LIST_SIZE` | `list_var`, `result_var` | Получить размер списка и записать в переменную `result_var` типа `int` |
| `STRING_SIZE` | `string_var`, `result_var` | Получить размер строки и записать в переменную `result_var` типа `int` |
@ -213,3 +215,5 @@ FUNC_END
|--------------------------|------------|-------------|
| `SLEEP` | `time_var` | Ждать миллисекунд из переменной `time_var` (тип переменной: int) |
| `NEW_THREAD` | `func` | Вызвать функцию `func` в новом потоке (КОМАНДА В РАЗРАБОТКЕ) |
| `IMPORT` | `script_path` | Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная) (КОМАНДА В РАЗРАБОТКЕ) |
| `IMPORT_TEXT` | `script_text_var` | Импортировать код из текста переменной в скрипт (КОМАНДА В РАЗРАБОТКЕ) |

8
hello_world.sus Normal file
View File

@ -0,0 +1,8 @@
FUNC null println text string # println function
TEMP_VAR char new_line 10 # init line break var
ADD_STR text new_line # add line break to text var
WRITE text cout # write text var to console
FUNC_END # end println function
TEMP_VAR string text Hello World!
USE_FUNC println null text

29
multithread.sus Normal file
View File

@ -0,0 +1,29 @@
FUNC null println text string # println function
TEMP_VAR char new_line 10
ADD_STR text new_line
WRITE text cout
FUNC_END
FUNC null count index int
INIT_VAR str str_index
TO_STRING index str_index
USE_FUNC println null str_index
TEMP_VAR int sl 100
SLEEP sl
FUNC_END
FUNC null one_thread
TEMP_VAR int start 1
TEMP_VAR int end 10
FOR count start end
FUNC_END
FUNC bool loop
SET_VAR while true
FUNC_END
NEW_THREAD one_thread
TEMP_VAR int start 1
TEMP_VAR int end 10
FOR count start end

80
print_args.sus Normal file
View File

@ -0,0 +1,80 @@
# constants
INIT_VAR char space
SET_VAR space 32
INIT_VAR int one
SET_VAR one 1
# constants
FUNC null println text string # println function
TEMP_VAR char new_line 10
ADD_STR text new_line
WRITE text cout
FUNC_END
# write args length
INIT_VAR integer args_size
LIST_SIZE args args_size
TEMP_VAR integer add -1
ADD_INT args_size add
INIT_VAR string args_size_str
TO_STRING args_size args_size_str
INIT_VAR string args_size_str_formatted # create var
SET_VAR args_size_str_formatted # init var with value
INIT_VAR string prefix
SET_VAR prefix Args length:
ADD_STR args_size_str_formatted prefix
ADD_STR args_size_str_formatted space
ADD_STR args_size_str_formatted args_size_str
USE_FUNC println null args_size_str_formatted
DROP_VAR prefix
DROP_VAR args_size_str_formatted
DROP_VAR args_size_str
DROP_VAR args_size
FUNC null print_arg_finally
INIT_VAR string prefix
SET_VAR prefix -
ADD_STR prefix space
ADD_STR prefix now_arg
USE_FUNC println null prefix
FUNC_END
FUNC null print_arg index integer
INIT_VAR bool is_first
SET_VAR is_first false
TEMP_VAR integer first 0
MORE index first is_first
GET_ITEM args index now_arg
IF is_first print_arg_finally
FUNC_END
FUNC null print_args_list
TEMP_VAR string text Args:
USE_FUNC println null text
INIT_VAR integer end_index
LIST_SIZE args end_index
TEMP_VAR integer add -1
ADD_INT end_index add
TEMP_VAR integer start_index 0
FOR print_arg start_index end_index
FUNC_END
INIT_VAR integer args_size
LIST_SIZE args args_size
INIT_VAR string now_arg
INIT_VAR bool is_args_more_than_one
MORE args_size one is_args_more_than_one
IF is_args_more_than_one print_args_list

File diff suppressed because it is too large Load Diff

View File

@ -312,6 +312,18 @@ pub enum CommandType {
/// Параметры: `optional_var`, `result_var`
UnpackOptional,
/// Упаковать `var` в `optional` и установить в `result_var`
///
/// Название: PACK_OPTIONAL \
/// Параметры: `var`, `result_var`
PackOptional,
/// Установить пустой `optional` в `var`
///
/// Название: NONE_OPTIONAL \
/// Параметры: `var`
NoneOptional,
/// Получить размер списка и записать в переменную `result_var` типа `int`
///
/// Название: LIST_SIZE \
@ -335,6 +347,18 @@ pub enum CommandType {
/// Название: FOR_STRING \
/// Параметры: `func(char)`, `string_var`
ForString,
/// Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная)
///
/// Название: IMPORT \
/// Параметры: `script_path`
Import,
/// Импортировать код из текста переменной в скрипт
///
/// Название: IMPORT_TEXT \
/// Параметры: `script_text_var`
ImportText,
}
impl CommandType {
@ -396,6 +420,10 @@ impl CommandType {
"HAS_VALUE" => Ok(CommandType::HasValue),
"HAS_OPTIONAL" => Ok(CommandType::HasOptional),
"UNPACK_OPTIONAL" => Ok(CommandType::UnpackOptional),
"PACK_OPTIONAL" => Ok(CommandType::PackOptional),
"NONE_OPTIONAL" => Ok(CommandType::NoneOptional),
"IMPORT_TEXT" => Ok(CommandType::ImportText),
"IMPORT" => Ok(CommandType::Import),
_ => Err(ScriptError::CommandUnknownError),
}
}

View File

@ -4,6 +4,7 @@ use super::super::var::{VarType, Variable};
use super::{RunningScript, ScriptError};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(PartialEq, Clone, Debug)]
pub struct Function {
@ -30,7 +31,7 @@ impl Function {
pub fn execute(
&self,
script: &mut RunningScript,
script: Arc<Mutex<RunningScript>>,
result_var: String,
args: Vec<Variable>,
is_global: bool,
@ -53,7 +54,7 @@ impl Function {
return Ok(());
}
command.execute(script, is_global, &mut locals, &mut temp_vars)?;
command.execute(script.clone(), is_global, &mut locals, &mut temp_vars)?;
if let CommandType::TempVar = command.command_type {
continue;
@ -61,6 +62,9 @@ impl Function {
for ele in temp_vars.clone() {
script
.clone()
.lock()
.unwrap()
.drop_var(ele, &mut locals)
.map_err(|f| (f, command.clone()))
.pohuy();
@ -69,6 +73,9 @@ impl Function {
if result_var != "null" {
script
.clone()
.lock()
.unwrap()
.set_var(
result_var,
locals.get("result").unwrap().clone(),

View File

@ -12,6 +12,9 @@ pub struct RunningScript {
variables: HashMap<String, Variable>,
}
unsafe impl Sync for RunningScript {}
unsafe impl Send for RunningScript {}
impl RunningScript {
pub fn new(script: Script) -> RunningScript {
RunningScript {
@ -186,23 +189,8 @@ impl RunningScript {
let mut var: Option<&mut Variable> = None;
let parts: Vec<&str> = (&name).split('.').collect();
match self.get_var(name.clone(), locals) {
Ok(i) => {
if init {
return Err(ScriptError::VarInitedError);
} else if i.get_type() != var_type {
return Err(ScriptError::TypeMismatchError);
}
}
Err(_) => {
if !init {
return Err(ScriptError::UnknownVarError);
}
}
}
let global =
global || (self.variables.contains_key(parts[0]) && !locals.contains_key(parts[0]));
let global = global
|| (self.variables.contains_key(parts[0]) && !locals.contains_key(parts[0]) && !init);
if parts.len() == 1 {
if global {
@ -287,9 +275,14 @@ impl RunningScript {
Err(ScriptError::FunctionUnknownError)
}
pub fn run(&mut self) -> Result<(), (ScriptError, Command)> {
pub fn run(self) -> Result<(), (ScriptError, Command)> {
let main_function = self.main_function.clone();
main_function.execute(self, "null".to_string(), Vec::new(), true)
main_function.execute(
Arc::new(Mutex::new(self)),
"null".to_string(),
Vec::new(),
true,
)
}
}