mirror of
https://github.com/MeexReay/sustlang.git
synced 2025-06-24 10:33:01 +03:00
input read
This commit is contained in:
parent
931fa4bf9d
commit
ee94ba13e2
@ -189,8 +189,11 @@ FUNC_END
|
|||||||
| Команда | Параметры | Описание |
|
| Команда | Параметры | Описание |
|
||||||
|--------------------------|------------|-------------|
|
|--------------------------|------------|-------------|
|
||||||
| `WRITE` | `name_var`, `stream_var` | Вывести переменную `name_var` в `stream_var` |
|
| `WRITE` | `name_var`, `stream_var` | Вывести переменную `name_var` в `stream_var` |
|
||||||
| `READ` | `name_var`, `size_var`, `stream_var` | Прочитать с `stream_var` ровно `size_var` байтов в переменную `name_var` типа `list[char]`/`string` |
|
| `READ` | `name_var`, `stream_var` | Прочитать с `stream_var` в переменную `name_var` типа `list[char]`/`string` |
|
||||||
|
| `READ_CHAR` | `name_var`, `stream_var` | Прочитать с `stream_var` один символ в переменную `name_var` типа `char` |
|
||||||
|
| `READ_LENGTH` | `name_var`, `length_var`, `stream_var` | Прочитать с `stream_var` ровно `length_var` байтов в переменную `name_var` типа `list[char]`/`string` |
|
||||||
| `READ_ALL` | `name_var`, `stream_var` | Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `list[char]`/`string` |
|
| `READ_ALL` | `name_var`, `stream_var` | Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `list[char]`/`string` |
|
||||||
|
| `READ_LINE` | `name_var`, `stream_var` | Прочитать с `stream_var` одну строку в переменную `name_var` типа `list[char]`/`string` |
|
||||||
|
|
||||||
|
|
||||||
### Файлы
|
### Файлы
|
||||||
|
14
input.sus
Normal file
14
input.sus
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
FUNC null println text string
|
||||||
|
TEMP_VAR char new_line 10
|
||||||
|
ADD_STR text new_line
|
||||||
|
WRITE text cout
|
||||||
|
FUNC_END
|
||||||
|
|
||||||
|
FUNC string input
|
||||||
|
READ_LINE result cin
|
||||||
|
FUNC_END
|
||||||
|
|
||||||
|
INIT_VAR string read
|
||||||
|
USE_FUNC input read
|
||||||
|
USE_FUNC println null read
|
@ -1,13 +1,14 @@
|
|||||||
use bytebuffer::ByteBuffer;
|
use bytebuffer::ByteBuffer;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
use crate::{variable, FileOutStream, Pohuy};
|
use crate::{variable, FileOutStream, IgnoreResult};
|
||||||
|
|
||||||
use super::super::command::CommandType;
|
use super::super::command::CommandType;
|
||||||
use super::super::script::{RunningScript, ScriptError};
|
use super::super::script::{RunningScript, ScriptError};
|
||||||
use super::super::var::{VarType, Variable};
|
use super::super::var::{VarType, Variable};
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::{fs, thread};
|
use std::{fs, thread};
|
||||||
@ -1831,7 +1832,176 @@ impl Command {
|
|||||||
)
|
)
|
||||||
.map_err(|f| (f, self.clone()))?;
|
.map_err(|f| (f, self.clone()))?;
|
||||||
}
|
}
|
||||||
|
CommandType::ReadLine => {
|
||||||
|
let name_var = self
|
||||||
|
.args
|
||||||
|
.get(0)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
let stream_var = self
|
||||||
|
.args
|
||||||
|
.get(1)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
let var = script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get_var(name_var.clone(), locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
let stream = script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get_var(stream_var.clone(), locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?
|
||||||
|
.as_in_stream()
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
|
||||||
|
let mut line = String::new();
|
||||||
|
let mut buffer = [0; 1];
|
||||||
|
while stream
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.read(&mut buffer)
|
||||||
|
.map_err(|_| (ScriptError::StreamReadError, self.clone()))?
|
||||||
|
> 0
|
||||||
|
{
|
||||||
|
if buffer[0] == b'\n' {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
line.push(buffer[0] as char);
|
||||||
|
}
|
||||||
|
|
||||||
|
let buffer = line.as_bytes().to_vec();
|
||||||
|
|
||||||
|
script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.set_var(
|
||||||
|
name_var,
|
||||||
|
match var {
|
||||||
|
Variable::List(VarType::Char, _) => Variable::from_list(
|
||||||
|
Some(
|
||||||
|
buffer
|
||||||
|
.iter()
|
||||||
|
.map(|f| Variable::from_char(Some(*f)))
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
VarType::List(Box::new(VarType::Char)),
|
||||||
|
),
|
||||||
|
Variable::String(_, _) => Variable::from_str(Some(
|
||||||
|
String::from_utf8(buffer)
|
||||||
|
.or(Err(ScriptError::StringUTF8Error))
|
||||||
|
.map_err(|f| (f, self.clone()))?,
|
||||||
|
)),
|
||||||
|
_ => {
|
||||||
|
return Err((ScriptError::TypeMismatchError, self.clone()));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
global,
|
||||||
|
false,
|
||||||
|
locals,
|
||||||
|
)
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
}
|
||||||
|
CommandType::ReadChar => {
|
||||||
|
let name_var = self
|
||||||
|
.args
|
||||||
|
.get(0)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
let stream_var = self
|
||||||
|
.args
|
||||||
|
.get(1)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
let stream = script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get_var(stream_var.clone(), locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?
|
||||||
|
.as_in_stream()
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
|
||||||
|
let mut buffer = [0; 1];
|
||||||
|
let read = stream
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.read(&mut buffer)
|
||||||
|
.map_err(|_| (ScriptError::StreamReadError, self.clone()))?
|
||||||
|
> 0;
|
||||||
|
let variable = if read {
|
||||||
|
Variable::from_char(Some(buffer[0]))
|
||||||
|
} else {
|
||||||
|
Variable::from_char(None)
|
||||||
|
};
|
||||||
|
|
||||||
|
script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.set_var(name_var, variable, global, false, locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
}
|
||||||
CommandType::Read => {
|
CommandType::Read => {
|
||||||
|
let name_var = self
|
||||||
|
.args
|
||||||
|
.get(0)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
let stream_var = self
|
||||||
|
.args
|
||||||
|
.get(1)
|
||||||
|
.ok_or((ScriptError::CommandArgsInvalidError, self.clone()))?
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
let var = script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get_var(name_var.clone(), locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
let stream = script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get_var(stream_var.clone(), locals)
|
||||||
|
.map_err(|f| (f, self.clone()))?
|
||||||
|
.as_in_stream()
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
|
||||||
|
let mut buffer: Vec<u8> = Vec::new();
|
||||||
|
stream.lock().unwrap().read(&mut buffer).unwrap();
|
||||||
|
|
||||||
|
script
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.set_var(
|
||||||
|
name_var,
|
||||||
|
match var {
|
||||||
|
Variable::List(VarType::Char, _) => Variable::from_list(
|
||||||
|
Some(
|
||||||
|
buffer
|
||||||
|
.iter()
|
||||||
|
.map(|f| Variable::from_char(Some(*f)))
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
VarType::List(Box::new(VarType::Char)),
|
||||||
|
),
|
||||||
|
Variable::String(_, _) => Variable::from_str(Some(
|
||||||
|
String::from_utf8(buffer)
|
||||||
|
.or(Err(ScriptError::StringUTF8Error))
|
||||||
|
.map_err(|f| (f, self.clone()))?,
|
||||||
|
)),
|
||||||
|
_ => {
|
||||||
|
return Err((ScriptError::TypeMismatchError, self.clone()));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
global,
|
||||||
|
false,
|
||||||
|
locals,
|
||||||
|
)
|
||||||
|
.map_err(|f| (f, self.clone()))?;
|
||||||
|
}
|
||||||
|
CommandType::ReadLength => {
|
||||||
let name_var = self
|
let name_var = self
|
||||||
.args
|
.args
|
||||||
.get(0)
|
.get(0)
|
||||||
|
@ -134,18 +134,36 @@ pub enum CommandType {
|
|||||||
/// Параметры: `name_var`, `stream_var`
|
/// Параметры: `name_var`, `stream_var`
|
||||||
Write,
|
Write,
|
||||||
|
|
||||||
/// Прочитать с `stream_var` ровно `size_var` байтов в переменную `name_var` типа `list[char]`
|
/// Прочитать с `stream_var` ровно `length_var` байтов в переменную `name_var` типа `string`/`list[char]`
|
||||||
///
|
///
|
||||||
/// Название: READ \
|
/// Название: READ_LENGTH \
|
||||||
/// Параметры: `name_var`, `size_var`, `stream_var`
|
/// Параметры: `name_var`, `length_var`, `stream_var`
|
||||||
Read,
|
ReadLength,
|
||||||
|
|
||||||
/// Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `list[char]`
|
/// Прочитать с `stream_var` все имеющиеся байты в переменную `name_var` типа `string`/`list[char]`
|
||||||
///
|
///
|
||||||
/// Название: READ_ALL \
|
/// Название: READ_ALL \
|
||||||
/// Параметры: `name_var`, `stream_var`
|
/// Параметры: `name_var`, `stream_var`
|
||||||
ReadAll,
|
ReadAll,
|
||||||
|
|
||||||
|
/// Прочитать с `stream_var` в переменную `name_var` типа `list[char]`/`string`
|
||||||
|
///
|
||||||
|
/// Название: READ \
|
||||||
|
/// Параметры: `name_var`, `stream_var`
|
||||||
|
Read,
|
||||||
|
|
||||||
|
/// Прочитать с `stream_var` один символ в переменную `name_var` типа `char`
|
||||||
|
///
|
||||||
|
/// Название: READ_CHAR \
|
||||||
|
/// Параметры: `name_var`, `stream_var`
|
||||||
|
ReadChar,
|
||||||
|
|
||||||
|
/// Прочитать с `stream_var` одну строку в переменную `name_var` типа `list[char]`/`string`
|
||||||
|
///
|
||||||
|
/// Название: READ_LINE \
|
||||||
|
/// Параметры: `name_var`, `stream_var`
|
||||||
|
ReadLine,
|
||||||
|
|
||||||
/// Функция `func` (с единственным аргументом с типом `int`) вызывается с `start_index` до `end_index` включительно, `start_index` и `end_index` это названия переменных
|
/// Функция `func` (с единственным аргументом с типом `int`) вызывается с `start_index` до `end_index` включительно, `start_index` и `end_index` это названия переменных
|
||||||
///
|
///
|
||||||
/// Название: FOR \
|
/// Название: FOR \
|
||||||
@ -415,6 +433,9 @@ impl CommandType {
|
|||||||
"WRITE" => Ok(CommandType::Write),
|
"WRITE" => Ok(CommandType::Write),
|
||||||
"READ" => Ok(CommandType::Read),
|
"READ" => Ok(CommandType::Read),
|
||||||
"READ_ALL" => Ok(CommandType::ReadAll),
|
"READ_ALL" => Ok(CommandType::ReadAll),
|
||||||
|
"READ_LINE" => Ok(CommandType::ReadLine),
|
||||||
|
"READ_CHAR" => Ok(CommandType::ReadChar),
|
||||||
|
"READ_LENGTH" => Ok(CommandType::ReadLength),
|
||||||
"FOR" => Ok(CommandType::For),
|
"FOR" => Ok(CommandType::For),
|
||||||
"FOR_MAP" => Ok(CommandType::ForMap),
|
"FOR_MAP" => Ok(CommandType::ForMap),
|
||||||
"FOR_LIST" => Ok(CommandType::ForList),
|
"FOR_LIST" => Ok(CommandType::ForList),
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
use std::{fs, io::Write};
|
use std::{fs, io::Write};
|
||||||
|
|
||||||
pub trait Pohuy<T, E> {
|
pub trait IgnoreResult<T, E> {
|
||||||
fn pohuy(&self) {}
|
fn ignore(&self) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T, E> Pohuy<T, E> for Result<T, E> {}
|
impl<T, E> IgnoreResult<T, E> for Result<T, E> {}
|
||||||
|
|
||||||
pub struct FileOutStream {
|
pub struct FileOutStream {
|
||||||
bytes: Vec<u8>,
|
bytes: Vec<u8>,
|
||||||
|
@ -14,6 +14,8 @@ pub enum ScriptError {
|
|||||||
FunctionUnknownError,
|
FunctionUnknownError,
|
||||||
FileReadError,
|
FileReadError,
|
||||||
FileWriteError,
|
FileWriteError,
|
||||||
|
StreamReadError,
|
||||||
|
StreamWriteError,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Display for ScriptError {
|
impl Display for ScriptError {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use super::super::command::{Command, CommandType};
|
use super::super::command::{Command, CommandType};
|
||||||
use super::super::other::Pohuy;
|
use super::super::other::IgnoreResult;
|
||||||
use super::super::var::{VarType, Variable};
|
use super::super::var::{VarType, Variable};
|
||||||
use super::{RunningScript, ScriptError};
|
use super::{RunningScript, ScriptError};
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ impl Function {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.drop_var(ele, &mut locals)
|
.drop_var(ele, &mut locals)
|
||||||
.map_err(|f| (f, command.clone()))
|
.map_err(|f| (f, command.clone()))
|
||||||
.pohuy();
|
.ignore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user