mirror of
https://github.com/MeexReay/sustlang.git
synced 2025-06-24 02:23:00 +03:00
multithread + some fixes
This commit is contained in:
parent
e2b6b5a0dc
commit
39d090baa4
@ -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
8
hello_world.sus
Normal 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
29
multithread.sus
Normal 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
80
print_args.sus
Normal 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
@ -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),
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user