This commit is contained in:
2025-12-12 17:36:57 -07:00
parent 0be2e644e4
commit 20f7cb9a4b
3 changed files with 84 additions and 3 deletions

View File

@@ -812,3 +812,4 @@ fn remove_unreachable_code<'a>(
}
(output, changed)
}

View File

@@ -1,8 +1,9 @@
use compiler::{CompilationResult, Compiler};
use helpers::{Documentation, Span};
use optimizer::optimize;
use parser::{sys_call::SysCall, Parser};
use safer_ffi::prelude::*;
use std::io::BufWriter;
use std::io::{BufWriter, Write};
use tokenizer::{
token::{Token, TokenType},
Tokenizer,
@@ -127,11 +128,11 @@ pub fn free_docs_vec(v: safer_ffi::Vec<FfiDocumentedItem>) {
pub fn compile_from_string(input: safer_ffi::slice::Ref<'_, u16>) -> FfiCompilationResult {
let res = std::panic::catch_unwind(|| {
let input = String::from_utf16_lossy(input.as_slice());
let mut writer = BufWriter::new(Vec::new());
let mut tmp = BufWriter::new(Vec::new());
let tokenizer = Tokenizer::from(input.as_str());
let parser = Parser::new(tokenizer);
let compiler = Compiler::new(parser, &mut writer, None);
let compiler = Compiler::new(parser, &mut tmp, None);
let res = compiler.compile();
@@ -139,6 +140,13 @@ pub fn compile_from_string(input: safer_ffi::slice::Ref<'_, u16>) -> FfiCompilat
return (safer_ffi::String::EMPTY, res.source_map);
}
let mut writer = BufWriter::new(Vec::new());
for instruction in optimize(res.instructions) {
_ = writer.write_all(instruction.instruction.to_string().as_bytes());
_ = writer.write_all(b"\n");
}
let Ok(compiled_vec) = writer.into_inner() else {
return (safer_ffi::String::EMPTY, res.source_map);
};

72
test.slang Normal file
View File

@@ -0,0 +1,72 @@
/// Laree script V1
device self = "db";
device larre = "d0";
device exportChute = "d1";
const TOTAL_SLOTS = 19;
const EXPORT_CHUTE = 1;
const START_STATION = 2;
let currentIndex = 0;
/// Waits for the larre to be idle before continuing
fn waitForIdle() {
yield();
while (!larre.Idle) {
yield();
}
}
/// Instructs the Larre to go to the chute and deposit
/// what is currently in its arm
fn deposit() {
larre.Setting = EXPORT_CHUTE;
waitForIdle();
larre.Activate = true;
waitForIdle();
exportChute.Open = false;
}
/// This function is responsible for checking the plant under
/// the larre at this index, and harvesting if applicable
fn checkAndHarvest(currentIndex) {
if (currentIndex <= EXPORT_CHUTE || ls(larre, 255, "Seeding") < 1) {
return;
}
// harvest from this device
while (ls(larre, 255, "Mature")) {
yield();
larre.Activate = true;
}
let hasRemainingPlant = ls(larre, 255, "Occupied");
// move to the export chute
larre.Setting = EXPORT_CHUTE;
waitForIdle();
deposit();
if (hasRemainingPlant) {
deposit();
}
larre.Setting = currentIndex;
waitForIdle();
if (ls(larre, 0, "Occupied")) {
larre.Activate = true;
}
waitForIdle();
}
loop {
yield();
if (!larre.Idle) {
continue;
}
let newIndex = currentIndex + 1 > TOTAL_SLOTS ? START_STATION : currentIndex + 1;
checkAndHarvest(currentIndex);
larre.Setting = newIndex;
currentIndex = newIndex;
}