further core improvements

This commit is contained in:
Daniella / Tove 2023-02-18 01:53:48 +01:00
parent 7d7782df0c
commit f76e03c5e6
Signed by: TudbuT
GPG key ID: 7D63D5634B7C417F
3 changed files with 36 additions and 17 deletions

View file

@ -11,15 +11,19 @@ pub fn lex(input: String, filename: String) -> Words {
fn read_block(str_words: &[String], isfn: bool, origin: &FrameInfo) -> (Option<u32>, Words, usize) {
let mut rem = None;
if str_words[0] == "{" && isfn {
let mut words = Vec::new();
let mut i = 0;
if str_words[0] == "{" {
if isfn {
let mut r = 0_u32;
while str_words[r as usize + 1] != "|" {
r += 1;
}
i += r as usize + 1;
rem = Some(r);
}
let mut words = Vec::new();
let mut i = 0;
i += 1;
}
while i < str_words.len() {
let word = str_words[i].to_owned();
match word.as_str() {
@ -118,6 +122,9 @@ fn read_block(str_words: &[String], isfn: bool, origin: &FrameInfo) -> (Option<u
"}" => {
break;
}
x if x.starts_with("\"") => {
words.push(Word::Const(Constant::Str(x[1..].to_owned())));
}
mut x => {
let mut ra = 0;
while x.starts_with("&") {
@ -158,17 +165,15 @@ fn parse_line(line: &str) -> Vec<String> {
if escaping {
if c == '\\' {
s += "\\";
continue;
}
if c == 'n' {
s += "\n";
continue;
}
if c == 'r' {
s += "\r";
continue;
}
escaping = false;
continue;
} else if c == '"' {
in_string = false;
escaping = false;
@ -176,9 +181,11 @@ fn parse_line(line: &str) -> Vec<String> {
}
if c == '\\' {
escaping = true;
continue;
}
} else {
if c == '"' {
s += "\"";
in_string = true;
continue;
}
@ -193,5 +200,8 @@ fn parse_line(line: &str) -> Vec<String> {
}
s += String::from(c).as_str();
}
if s != "" {
words.push(s);
}
words
}

View file

@ -1,4 +1,4 @@
use spl::runtime::*;
use spl::{lexer::lex, runtime::*};
use std::{
io::{stdout, Write},
@ -49,5 +49,6 @@ fn main() {
],
}
.exec(&mut stack);
lex("func println { | print \"\\n\" print } def helloworld \"Hello, World\" =helloworld helloworld println".to_owned(), "TEST".to_owned()).exec(&mut stack);
Runtime::reset();
}

View file

@ -35,6 +35,8 @@ impl Runtime {
rt.make_type("int".to_owned(), |t| t);
rt.make_type("long".to_owned(), |t| t);
rt.make_type("mega".to_owned(), |t| t);
rt.make_type("float".to_owned(), |t| t);
rt.make_type("double".to_owned(), |t| t);
rt.make_type("func".to_owned(), |t| t);
rt.make_type("array".to_owned(), |t| t);
rt.make_type("str".to_owned(), |t| t);
@ -260,7 +262,7 @@ impl Stack {
}
}
#[derive(Clone)]
#[derive(Clone, Debug)]
pub enum Keyword {
/// <none>
///
@ -316,11 +318,13 @@ pub enum Constant {
Int(i32),
Long(i64),
Mega(i128),
Float(f32),
Double(f64),
Func(AFunc),
Str(String),
}
#[derive(Clone)]
#[derive(Clone, Debug)]
pub enum Word {
Key(Keyword),
Const(Constant),
@ -328,7 +332,7 @@ pub enum Word {
ObjCall(String, bool, u32),
}
#[derive(Clone)]
#[derive(Clone, Debug)]
pub struct Words {
pub words: Vec<Word>,
}
@ -433,6 +437,8 @@ impl Object {
Constant::Int(x) => x > &0,
Constant::Long(x) => x > &0,
Constant::Mega(x) => x > &0,
Constant::Float(_) => true,
Constant::Double(_) => true,
Constant::Func(_) => true,
Constant::Str(x) => x == "",
}
@ -450,9 +456,11 @@ impl From<Constant> for Object {
Constant::Int(_) => x.get_type_by_id(1),
Constant::Long(_) => x.get_type_by_id(2),
Constant::Mega(_) => x.get_type_by_id(3),
Constant::Func(_) => x.get_type_by_id(4),
// array is 5
Constant::Str(_) => x.get_type_by_id(6),
Constant::Float(_) => x.get_type_by_id(4),
Constant::Double(_) => x.get_type_by_id(5),
Constant::Func(_) => x.get_type_by_id(6),
// array is 7
Constant::Str(_) => x.get_type_by_id(8),
}
.expect("runtime uninitialized: default types not set.")
}),