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]`) |
|
| `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_STR` | `str_var`, `start_index`, `end_index` | Сделать подстроку из строки `str_var` и сохранить туда же |
|
||||||
| `SUB_LIST` | `list_var`, `start_index`, `end_index` | Сделать подсписок из списка `list_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` |
|
| `UNPACK_OPTIONAL` | `optional_var`, `result_var` | Достать данные из `optional_var` и установить в `result_var` |
|
||||||
| `LIST_SIZE` | `list_var`, `result_var` | Получить размер списка и записать в переменную `result_var` типа `int` |
|
| `LIST_SIZE` | `list_var`, `result_var` | Получить размер списка и записать в переменную `result_var` типа `int` |
|
||||||
| `STRING_SIZE` | `string_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) |
|
| `SLEEP` | `time_var` | Ждать миллисекунд из переменной `time_var` (тип переменной: int) |
|
||||||
| `NEW_THREAD` | `func` | Вызвать функцию `func` в новом потоке (КОМАНДА В РАЗРАБОТКЕ) |
|
| `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`
|
/// Параметры: `optional_var`, `result_var`
|
||||||
UnpackOptional,
|
UnpackOptional,
|
||||||
|
|
||||||
|
/// Упаковать `var` в `optional` и установить в `result_var`
|
||||||
|
///
|
||||||
|
/// Название: PACK_OPTIONAL \
|
||||||
|
/// Параметры: `var`, `result_var`
|
||||||
|
PackOptional,
|
||||||
|
|
||||||
|
/// Установить пустой `optional` в `var`
|
||||||
|
///
|
||||||
|
/// Название: NONE_OPTIONAL \
|
||||||
|
/// Параметры: `var`
|
||||||
|
NoneOptional,
|
||||||
|
|
||||||
/// Получить размер списка и записать в переменную `result_var` типа `int`
|
/// Получить размер списка и записать в переменную `result_var` типа `int`
|
||||||
///
|
///
|
||||||
/// Название: LIST_SIZE \
|
/// Название: LIST_SIZE \
|
||||||
@ -335,6 +347,18 @@ pub enum CommandType {
|
|||||||
/// Название: FOR_STRING \
|
/// Название: FOR_STRING \
|
||||||
/// Параметры: `func(char)`, `string_var`
|
/// Параметры: `func(char)`, `string_var`
|
||||||
ForString,
|
ForString,
|
||||||
|
|
||||||
|
/// Импортировать код из скрипта по пути (путь должен быть с расширением файла) (путь это переменная)
|
||||||
|
///
|
||||||
|
/// Название: IMPORT \
|
||||||
|
/// Параметры: `script_path`
|
||||||
|
Import,
|
||||||
|
|
||||||
|
/// Импортировать код из текста переменной в скрипт
|
||||||
|
///
|
||||||
|
/// Название: IMPORT_TEXT \
|
||||||
|
/// Параметры: `script_text_var`
|
||||||
|
ImportText,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CommandType {
|
impl CommandType {
|
||||||
@ -396,6 +420,10 @@ impl CommandType {
|
|||||||
"HAS_VALUE" => Ok(CommandType::HasValue),
|
"HAS_VALUE" => Ok(CommandType::HasValue),
|
||||||
"HAS_OPTIONAL" => Ok(CommandType::HasOptional),
|
"HAS_OPTIONAL" => Ok(CommandType::HasOptional),
|
||||||
"UNPACK_OPTIONAL" => Ok(CommandType::UnpackOptional),
|
"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),
|
_ => Err(ScriptError::CommandUnknownError),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ use super::super::var::{VarType, Variable};
|
|||||||
use super::{RunningScript, ScriptError};
|
use super::{RunningScript, ScriptError};
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
#[derive(PartialEq, Clone, Debug)]
|
#[derive(PartialEq, Clone, Debug)]
|
||||||
pub struct Function {
|
pub struct Function {
|
||||||
@ -30,7 +31,7 @@ impl Function {
|
|||||||
|
|
||||||
pub fn execute(
|
pub fn execute(
|
||||||
&self,
|
&self,
|
||||||
script: &mut RunningScript,
|
script: Arc<Mutex<RunningScript>>,
|
||||||
result_var: String,
|
result_var: String,
|
||||||
args: Vec<Variable>,
|
args: Vec<Variable>,
|
||||||
is_global: bool,
|
is_global: bool,
|
||||||
@ -53,7 +54,7 @@ impl Function {
|
|||||||
return Ok(());
|
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 {
|
if let CommandType::TempVar = command.command_type {
|
||||||
continue;
|
continue;
|
||||||
@ -61,6 +62,9 @@ impl Function {
|
|||||||
|
|
||||||
for ele in temp_vars.clone() {
|
for ele in temp_vars.clone() {
|
||||||
script
|
script
|
||||||
|
.clone()
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.drop_var(ele, &mut locals)
|
.drop_var(ele, &mut locals)
|
||||||
.map_err(|f| (f, command.clone()))
|
.map_err(|f| (f, command.clone()))
|
||||||
.pohuy();
|
.pohuy();
|
||||||
@ -69,6 +73,9 @@ impl Function {
|
|||||||
|
|
||||||
if result_var != "null" {
|
if result_var != "null" {
|
||||||
script
|
script
|
||||||
|
.clone()
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
.set_var(
|
.set_var(
|
||||||
result_var,
|
result_var,
|
||||||
locals.get("result").unwrap().clone(),
|
locals.get("result").unwrap().clone(),
|
||||||
|
@ -12,6 +12,9 @@ pub struct RunningScript {
|
|||||||
variables: HashMap<String, Variable>,
|
variables: HashMap<String, Variable>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Sync for RunningScript {}
|
||||||
|
unsafe impl Send for RunningScript {}
|
||||||
|
|
||||||
impl RunningScript {
|
impl RunningScript {
|
||||||
pub fn new(script: Script) -> RunningScript {
|
pub fn new(script: Script) -> RunningScript {
|
||||||
RunningScript {
|
RunningScript {
|
||||||
@ -186,23 +189,8 @@ impl RunningScript {
|
|||||||
let mut var: Option<&mut Variable> = None;
|
let mut var: Option<&mut Variable> = None;
|
||||||
let parts: Vec<&str> = (&name).split('.').collect();
|
let parts: Vec<&str> = (&name).split('.').collect();
|
||||||
|
|
||||||
match self.get_var(name.clone(), locals) {
|
let global = global
|
||||||
Ok(i) => {
|
|| (self.variables.contains_key(parts[0]) && !locals.contains_key(parts[0]) && !init);
|
||||||
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]));
|
|
||||||
|
|
||||||
if parts.len() == 1 {
|
if parts.len() == 1 {
|
||||||
if global {
|
if global {
|
||||||
@ -287,9 +275,14 @@ impl RunningScript {
|
|||||||
Err(ScriptError::FunctionUnknownError)
|
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();
|
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