full brainfuck

This commit is contained in:
Altareos
2022-02-24 16:11:58 +01:00
parent 05b989125d
commit 2ebad03612
3 changed files with 127 additions and 12 deletions

View File

@@ -3,8 +3,13 @@
<assign variable="prog">
<call function="string-split">
<arguments>
<call function="input">
<arguments />
<call function="array-get">
<arguments>
<call function="get-args">
<arguments />
</call>
<integer value="1" />
</arguments>
</call>
<string value="" />
</arguments>
@@ -19,9 +24,47 @@
<assign variable="t">
<array />
</assign>
<assign variable="found">
<integer value="0" />
</assign>
<assign variable="inp">
<integer value="0" />
</assign>
<each variable="c">
<value variable="prog" />
<do>
<if>
<and>
<equal>
<value variable="found" />
<integer value="0" />
</equal>
<equal>
<value variable="c" />
<string value="," />
</equal>
</and>
<then>
<assign variable="in">
<call function="string-split">
<arguments>
<call function="input">
<arguments />
</call>
<string value="" />
</arguments>
</call>
</assign>
<assign variable="found">
<integer value="1" />
</assign>
</then>
</if>
</do>
</each>
<for variable="_">
<from><integer value="0" /></from>
<to><integer value="100" /></to>
<to><integer value="10" /></to>
<step><integer value="1" /></step>
<do>
<call function="array-push">
@@ -134,10 +177,14 @@
<then>
<call function="print">
<arguments>
<call function="array-get">
<call function="to-ascii">
<arguments>
<value variable="t" />
<value variable="p" />
<call function="array-get">
<arguments>
<value variable="t" />
<value variable="p" />
</arguments>
</call>
</arguments>
</call>
</arguments>
@@ -150,7 +197,28 @@
<value variable="c" />
</equal>
<then>
<call function="array-set">
<arguments>
<value variable="t" />
<value variable="p" />
<call function="from-ascii">
<arguments>
<call function="array-get">
<arguments>
<value variable="in" />
<value variable="inp" />
</arguments>
</call>
</arguments>
</call>
</arguments>
</call>
<assign variable="inp">
<add>
<value variable="inp" />
<integer value="1" />
</add>
</assign>
</then>
<else>
<if>
@@ -337,11 +405,7 @@
</while>
</then>
</if>
</then>
<else>
</else>
</if>
</else>
</if>
@@ -363,6 +427,11 @@
<integer value="1" />
</add>
</assign>
<!-- <call function="print">
<arguments>
<value variable="t" />
</arguments>
</call> -->
</do>
</while>
</main>

View File

@@ -832,6 +832,10 @@ mod stl {
String::from("array-length"),
Value::StdFunction(array_length),
);
ctx.assign(String::from("to-ascii"), Value::StdFunction(to_ascii));
ctx.assign(String::from("from-ascii"), Value::StdFunction(from_ascii));
ctx.assign(String::from("get-args"), Value::StdFunction(get_args));
}
fn print(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
@@ -964,6 +968,48 @@ mod stl {
Err("bad argument count in call to 'array-length'")?
}
}
fn to_ascii(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
if vals.len() == 1 {
if let Value::Integer(i) = &vals[0] {
if i <= &255 {
Ok(Some(Value::String(String::from_utf8(vec![*i as u8])?)))
} else {
Err("invalid integer in call to 'to-ascii'")?
}
} else {
Err("invalid argument in call to 'to-ascii'")?
}
} else {
Err("bad argument count in call to 'to-ascii'")?
}
}
fn from_ascii(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
if vals.len() == 1 {
if let Value::String(s) = &vals[0] {
if s.len() == 1 {
Ok(Some(Value::Integer(s.as_bytes()[0] as i64)))
} else {
Err("invalid string in call to 'from-ascii'")?
}
} else {
Err("invalid argument in call to 'from-ascii'")?
}
} else {
Err("bad argument count in call to 'from-ascii'")?
}
}
fn get_args(vals: Vec<Value>) -> Result<Option<Value>, Box<dyn Error>> {
if vals.len() == 0 {
Ok(Some(Value::Array(Rc::new(RefCell::new(
std::env::args().skip(1).map(|arg| Value::String(arg)).collect()
)))))
} else {
Err("bad argument count in call to 'get-args'")?
}
}
}
pub fn run(filename: &str) -> Result<(), Box<dyn Error>> {

View File

@@ -4,6 +4,6 @@ use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
if let Err(e) = run(&args[1]) {
panic!("Error occurred: {}", e);
eprintln!("Error occurred: {}", e);
}
}